6

私は何度もこの疑いを持っていますが、正しい解決策を見つけられませんでした。今度はクリアしたい。私は次のような状況を持っています

1. 
String sNumber="ksadfl.jksadlf";
if(sNumber.lastIndexOf('.')>0)
   //do something
...
...
if(sNumber.lastIndexOf('.')>1)
 //do something
...

2.
int index = sNumber.lastIndexOf('.');
if(index>0)
//do something
...
...
if(index>1)
//do something
...

最初の方法と2番目の方法のトレードオフは何ですか? 結果を変数に格納するのと、関数を 2 回呼び出すのとでは、どちらが優れていますか?

4

4 に答える 4

3

質問は 2 つのリーン コールについてのみ説明しているため、lastIndexOf実際には 2 つの違いはほとんどありません。プロキシ経由のリモート呼び出しまたはデータベース ヒットを行うものである場合、メソッドの結果を変数に格納すると、改善が見られます。

ここに画像の説明を入力

メソッドを再度呼び出すことの良い点は、以前のブロックのどこかで操作された場合に備えて、インデックスの最新の値を常に取得できることです。ほとんどの場合、#2 が正しい選択になりますが、上記の正確な例では、#1 です。

于 2013-04-20T07:32:53.853 に答える
2

あなたの疑問は明らかです。2 番目のアプローチは適切で効率的です。

文字列変数のデータが毎回変更されていない場合は、毎回インデックスを取得する必要がないためです。いいえ、何度も使用する必要がありますsNumber.lastIndexOf('.')lastIndexOf()関数が実行されるたびに、余分な時間と他のリソースが必要になります。

したがって、プログラムをより高速かつ短くする 2 番目のオプションを使用することをお勧めします。

于 2013-04-20T05:19:15.710 に答える
1

あなたの質問は、メモリ使用量と CPU 使用量の間の古典的なトレードオフです。

まず、プログラムのメモリ使用量を小さくするか、高速に実行するかを決定する必要があります。解決策 1 はメモリ使用量が最小になる可能性が高く (int を格納していないため)、解決策 2 は indexOf の計算を 2 回行う必要がないため、実行時間が最速になります。

そうは言っても、計算をメモリに保存しても、常に最速のプログラムになるとは限りません。メモリ フットプリントが小さいと、多くの場合、キャッシュ ミスが少なくなります。キャッシュ ミスは、単純に計算を 2 回行うよりもはるかに遅くなることがよくあります。

キャッシュ ミスを最小限に抑えることの重要性については、C++ でのリストとベクトルのパフォーマンスに関するこの投稿をご覧ください。データをコピーする必要がないため、リストはベクトルよりもはるかに高速であると予想されます。ただし、リストの実装では、データのランダムアクセスがはるかに多くなるため、キャッシュミスが多くなり、ベクトルが大幅に高速になります。

最後に、2 つのソリューションのパフォーマンスを測定し、メモリと CPU 使用率のどの組み合わせが最も好きかを判断することをお勧めします。

于 2013-04-20T07:34:17.050 に答える