4

コンテキスト:値が3桁または4桁の文字列で報告されるというビジネス要件があります。文字列が3桁の場合、その値は実際には*10です。

たとえば、123は1230を表し、4567は4567を表します。

保存された整数から文字列に変換し直す場合、上記のコードはこれを判断する1つの方法と見なされます。私たちが持っている問題は、オプティマイザーがx(整数と浮動小数点)のこのコードを削除することです。特にJavaに注目しますが、次の質問は他の言語がどのように動作するかです

これを行う他の明らかな方法は、Mod(x%10)を使用することです。

4

5 に答える 5

2

次の質問は、他の言語がどのように動作するかということです。

さまざまな最適化レベルでgccを使用してCでいくつかの簡単なテストを行い、生成されたコードを確認しました。いいえ、最適化されません。コンパイラがx == (x/10)*10コンパイル時に評価できる場合でも( xは定数であるため)、正しく評価されます。

更新:これは、考えてみれば明らかな結果です。コンパイラは、整数のセットの1/10に対してのみ機能するため、整数に対してのみ「最適化」(x/10)*10することはできません。xx

于 2012-04-26T00:49:10.357 に答える
1

あなたの質問は、(x/10)*10必然的にに等しいという誤った推定をしxます。一般に、Javaコンパイラと仮想マシンは、Java言語仕様の要件を満たしている限り、任意の方法で最適化できます。

xがafloatまたはaの場合、浮動小数点の丸め誤差がない場合doublex == (x/10)*10ただし、10はanintであり、ifxintorのlong場合、式は整数除算を使用します。Java言語仕様は、整数に関して除算演算子が何をするかについて非常に明確です。つまり、ゼロに向かって丸められます。したがって、Javaコンパイラは、その式を除算とそれに続く乗算以外の何かに最適化する場合がありますが、オプティマイザが何を実行する場合でも、正しい結果を生成する必要があります。

于 2012-04-26T01:45:19.623 に答える
0

上記のコードは、これを判断する1つの方法と見なされています

理由はわかりません。理由はわかりません。最後の桁がまだゼロでない場合は、最後の桁をゼロに変更するだけです。

コンパイラとJVMは、同じ答えが得られないため、最適化することは許可されていません。

于 2012-04-26T01:31:16.903 に答える
0

要件を完全に理解しているかどうかはわかりません。あなたは確かに次のようなことをすることができます

String s = x < 1000 ? String.valueOf(10*x) : String.valueOf(x);

整数除算ではIDではないため、オプティマイザーはコードを削除できない可能性がありますが、非常に複雑なアプローチのようです。

ちなみに、値が確実に9999で最高になり、速度が重要な場合は、静的初期化子または遅延のいずれかによって作成された10,000文字列の静的配列を用意してください。

于 2012-04-26T05:28:55.790 に答える
-1

説明したように、これを最適化することはできませんが、なぜ使用しないのですか?

(x%10 == 0) ? x/10 : x

元に戻すには?

于 2012-04-26T01:12:17.320 に答える