2016-10-01 6 views
0

これらの関数はどちらもLongをバイナリ文字列に変換しますが、もう一方は他よりも最適化されていますか?私は、Longクラスのソースコードを見て、これらの2つの静的メソッドは異なる実装を持っています。Long.toBinaryString()とLong.toString(num、2)の違いは?

+0

'toBinaryString'がタスクに最適化されていないと、私はショックを受けます。 – 4castle

+0

toStringは剰余と除算を使用して桁を作成しますが、toBinaryStringは右シフトを使用します。しかし、私は、コンパイラが2を使って除算を最適化するかどうかと、残りの2つをシフトを使って最適化するかどうかはわかりません。だから私は本当に大きな違いがあるかどうかは分かりません。コンパイラの最適化が行われていれば、それらはかなり似ていると思っています。ちょうど私の思考は、それが本当であるかどうか確かではありません。 –

+1

JMH/JIT分析ではなく、いくつかのMicrobenchmarkingプラクティスを遵守したクイックベンチマークから、変換の "コア"ループ(数字を 'char'バッファに書き込む)は〜25%一般的な 'toString'メソッドの方が遅くなります。 **しかし、**かなりのオーバーヘッドは、 'toString'メソッドで文字列を作成するときに、' char'配列の関連部分を*コピー*する必要があるという事実に起因します。 'toBinaryString'では、必要な文字の数が*直接*計算され、結果の' char'配列は*コピーされずに文字列*に渡されます。 – Marco13

答えて

0

答えはテストを行うだけで、取得するのは簡単です:私は、私は(ラズベリーパイ)でこれをテストしたシステムで

class Test { 
    public static void main (String args[]) { 
    long millisStart = System.currentTimeMillis(); 
    for(int i = 0; i < 1000000; i++) { 
     String s = Long.toBinaryString(i/10000); 
    } 
    System.out.println(System.currentTimeMillis() - millisStart); 

    millisStart = System.currentTimeMillis(); 
    for(int i = 0; i < 1000000; i++) { 
     String st = Long.toString(i/10000, 2); 
    } 
    System.out.println(System.currentTimeMillis() - millisStart); 
    } 
} 

を、これがそう3279.

に対して655になります次のように推測してください。long.toString(num、2);遅いです。それは柔軟でなければならないので、不思議ではありません。

+0

(私はdownvoterではありませんが、*適切な*ベンチマークは同様の結論になるでしょう)、与えられたフォームのベンチマークは決して信頼できません**。 – Marco13

+0

適切なベンチマークではありませんでした。しかし、差異の大きさと、特定の機能の専門化とを組み合わせると、「もう一方よりも最適化されていますか?」という明確な答えが得られます。 –

+0

Florianテストに感謝します。誰かがソースコードを見て、toBinaryStringがより最適化されている理由を説明できるかどうかを調べたいと思っています。 (私はdownvoter btwではない) – user2603017

関連する問題