3

Java で次の単純なコードを考えてみましょう。

void func(String test)
{
    if(str.length() > 0)
    {
       //do something
    }
}

str.length() > 0 を実行すると、この関数が呼び出されるたびに、0 の整数値を格納するために 4 バイトのメモリが割り当てられることになりますか?

4

6 に答える 6

2

クリーンでクリアでシンプルなコードを作成すると、JITは95%以上のケースでコードを最適化します。スマートにしようとすると、コードが良くなるのではなく、悪くなる可能性がはるかに高くなります。

この規則にはいくつかの注目すべき例外がありますが、これらは数年しか続かない傾向があります。たとえば、Java 5.0のロックは同期よりもはるかに高速でしたが、Java7では同期の方がはるかに高速である可能性があります。

パフォーマンスを検討するときは、コードの個々の行や個々のライブラリではなく、システム全体の動作を確認する必要があります。これを怠ると、もっと重要なことが無視されている間、何の違いもないことを心配することに時間を費やす可能性があります。

構成設定を変更するだけで全体を高速化できたときに、チーム全体がシステムの一部の最適化に取り組んでいるのを何年も見てきました。これは、彼らが自分たちが書いているコードに彼らの見方を限定し、彼らが接続しているシステムをどのように使用するかを考慮していなかったためです。彼らが些細なことでもっとスピードアップするのを見ることができたときに何年もの仕事を無駄にすることを想像してください、そしてこれがあなたに起こらないことを確認してください。;)

于 2012-12-26T10:19:57.027 に答える
2

この関数 (を含む0) を実行するために必要なメモリは、コンパイルされたプログラム (.class / .jar/.apk) の一部であり、関数が実行される回数とは関係ありません関数がインライン化されている場合でも、関数が呼び出されるさまざまな場所の数に基づいてコード サイズのみが大きくなり、コードの実行中に実行時にメモリが割り当てられることはありません。

一方、2 コメント

  • ハードコーディングには、はるかに大きな問題があります。
  • length > 0厳密な意味を除いて、ハードコーディングとしてカウントされるとは思えません。
于 2012-12-26T09:29:52.210 に答える
0

このコードの実行時にメモリ割り当ては行われません。

于 2012-12-26T09:29:40.530 に答える
0

このコードはメソッド ローカルであるため、実行後にメモリは自動的に再利用されます。ASはメソッド内です。

于 2012-12-26T09:49:39.517 に答える
0

メモリ割り当ての観点から、上記のコードでは深刻なものは見えません。

if(str.length() > 0) { }

ここでは、比較のための真の要件であるため、ハードコーディング値とは見なされません。

メモリ使用率に非常に厳しい場合は、常に正確な必要なデータ型を選択してください。

于 2012-12-26T09:45:46.823 に答える
0

はい。ただし、関数を終了した直後に破棄されます。intですprimitive type。プリミティブ型は、Java で最速と見なされます。ですので、費用はあまりかからないと思います。

于 2012-12-26T09:50:38.560 に答える