タグ付けされた質問 「micro-optimization」


13
パフォーマンスが重要な場合、JavaのString.format()を使用する必要がありますか?
ログ出力などのために、常に文字列を構築する必要があります。JDKバージョンでStringBufferは、(多くの追加、スレッドセーフ)とStringBuilder(多くの追加、非スレッドセーフ)をいつ使用するかを学びました。 使用についてのアドバイスは何String.format()ですか?それは効率的ですか、またはパフォーマンスが重要なワンライナーの連結に固執する必要がありますか? 例えば醜い古いスタイル、 String s = "What do you get if you multiply " + varSix + " by " + varNine + "?"; 整頓された新しいスタイル(String.format、おそらく遅い)、 String s = String.format("What do you get if you multiply %d by %d?", varSix, varNine); 注:私の具体的な使用例は、コード全体で何百もの「ワンライナー」ログ文字列です。彼らはループを含まないので、StringBuilderヘビー級です。String.format()特に興味があります。



3
なぜ私のアプリケーションは、その寿命の24%をnullチェックに費やしているのですか?
パフォーマンスが重要なバイナリ決定ツリーがあり、この質問を1行のコードに集中したいと思います。バイナリツリーイテレータのコードは、それに対してパフォーマンス分析を実行した結果です。 public ScTreeNode GetNodeForState(int rootIndex, float[] inputs) { 0.2% ScTreeNode node = RootNodes[rootIndex].TreeNode; 24.6% while (node.BranchData != null) { 0.2% BranchNodeData b = node.BranchData; 0.5% node = b.Child2; 12.8% if (inputs[b.SplitInputIndex] <= b.SplitValue) 0.8% node = b.Child1; } 0.4% return node; } BranchDataはフィールドであり、プロパティではありません。インライン化されないリスクを防ぐためにこれを行いました。 BranchNodeDataクラスは次のとおりです。 public sealed class BranchNodeData { /// …

3
Pythonの例外ハンドラのコスト
で別の質問、受け入れ答えは、パフォーマンスを向上させるために、try / exceptブロックでPythonコードにif文(非常に安い)の交換を提案しました。 コーディングスタイルの問題は別として、例外がトリガーされないと仮定すると、例外ハンドラーがある場合とない場合と比較してゼロに比較するifステートメントがある場合と、例外ハンドラーがある場合とでは、パフォーマンスにどの程度の違いがありますか?

4
何が速いですか:in_arrayまたはisset?[閉まっている]
現在のところ、この質問はQ&A形式には適していません。私たちは回答が事実、参考文献、または専門知識によってサポートされることを期待しますが、この質問はおそらく議論、議論、投票、または拡張された議論を誘います。この質問を改善でき、再開できると思われる場合は、ヘルプセンターにアクセスしてください。 7年前休業。 安い低速サーバー(または大量のトラフィックを持つサーバー)でも実行できる最適化されたコードを常に書きたいので、この質問は単に私にとってのものです。 周りを見回したが答えが見つからなかった。私の場合、配列のキーは重要ではない(当然のことながら擬似コードです)ことを念頭に置いて、これらの2つの例の間で何が速いのか疑問に思いました。 <?php $a = array(); while($new_val = 'get over 100k email addresses already lowercased'){ if(!in_array($new_val, $a){ $a[] = $new_val; //do other stuff } } ?> <?php $a = array(); while($new_val = 'get over 100k email addresses already lowercased'){ if(!isset($a[$new_val]){ $a[$new_val] = true; //do other stuff } } …

9
ループの展開がまだ役立つ場合はいつですか?
ループのアンロールによって、パフォーマンスが非常に重要なコード(モンテカルロシミュレーション内で何百万回も呼び出されるクイックソートアルゴリズム)を最適化しようとしています。これは私がスピードアップしようとしている内側のループです: // Search for elements to swap. while(myArray[++index1] < pivot) {} while(pivot < myArray[--index2]) {} 私は次のようなものに展開してみました: while(true) { if(myArray[++index1] < pivot) break; if(myArray[++index1] < pivot) break; // More unrolling } while(true) { if(pivot < myArray[--index2]) break; if(pivot < myArray[--index2]) break; // More unrolling } これはまったく違いがなかったので、より読みやすい形式に戻しました。ループのアンロールを試みたときも、同様の経験をしました。最新のハードウェアでの分岐予測子の品質を考えた場合、ループの展開が依然として最適な有用な最適化となるのはいつですか?

7
Java文字列からすべての印刷不可能な文字を取り除く最速の方法
StringJavaで印刷できない文字をすべて削除する最速の方法は何ですか? これまでのところ、138バイト、131文字の文字列で試して測定しました。 文字列replaceAll()-最も遅いメソッド 517009結果/秒 パターンをプリコンパイルしてから、Matcherを使用します replaceAll() 637836結果/秒 StringBufferを使用し、codepointAt()1つずつ使用してコードポイントを取得し、StringBufferに追加します 711946結果/秒 StringBufferを使用し、charAt()1つずつ使用して文字を取得し、StringBufferに追加します 1052964結果/秒 char[]バッファを事前に割り当て、charAt()1つずつ使用して文字を取得し、このバッファを埋めてから、文字列に変換し直します 2022653結果/秒 char[]古いバッファと新しいバッファの2つのバッファを事前に割り当て、を使用して既存の文字列のすべての文字を一度に取得しgetChars()、古いバッファを1つずつ繰り返し、新しいバッファを埋めてから、新しいバッファを文字列に変換します-私自身の最速バージョン 2502502結果/秒 2つのバッファを持つ同じもの-のみを使用しbyte[]、getBytes()エンコーディングを「utf-8」として指定します 857485結果/秒 2つのbyte[]バッファを持つ同じものですが、定数としてエンコーディングを指定しますCharset.forName("utf-8") 791076結果/秒 2つのbyte[]バッファを持つ同じものですが、エンコーディングを1バイトのローカルエンコーディングとして指定します(ほとんど正気ではありません) 370164結果/秒 私の最善の試みは次のとおりでした: char[] oldChars = new char[s.length()]; s.getChars(0, s.length(), oldChars, 0); char[] newChars = new char[s.length()]; int newLen = 0; for (int j = 0; j < s.length(); j++) { …

2
最速のポーリングループ-1 CPUサイクルをトリミングするにはどうすればよいですか?
ARM Cortex M3(STM32F101と同様)のリアルタイムアプリケーションでは、内部ペリフェラルのレジスタのビットをゼロになるまでポーリングし、ループをできるだけタイトにします。ビットバンディングを使用して適切なビットにアクセスします。(動作する)Cコードは while (*(volatile uint32_t*)kMyBit != 0); そのコードは、オンチップ実行可能RAMにコピーされます。手動で最適化した後²、ポーリングループは次のようになり、6サイクルに設定しました。 0x00600200 681A LDR r2,[r3,#0x00] 0x00600202 2A00 CMP r2,#0x00 0x00600204 D1FC BNE 0x00600200 ポーリングの不確実性をどのようにして下げることができますか?5サイクルのループは私の目標に適合します。ゼロになった後、同じビットを15.5サイクルにできるだけ近づけてサンプリングします。 私の仕様では、少なくとも6.5 CPUクロックサイクルの低パルスを確実に検出することを求めています。持続時間が12.5サイクル未満の場合、確実に短いと分類します。そして、それが18.5サイクル以上続く限り、確実に分類します。パルスには、CPUクロックとの位相関係が定義されていません。これは、私の唯一の正確なタイミング基準です。これには、最大で5クロックのポーリングループが必要です。実際、私は5クロックサイクルでポーリングできる数十年前の8ビットCPUで実行されるコードをエミュレートしており、それが仕様になっています。 ループの前にNOPを挿入することでコードアライメントをオフセットしようとしましたが、多くのバリエーションで試しましたが、変化は見られませんでした。 CMPとLDRを反転させようとしましたが、それでも6サイクルが得られます。 0x00600200 681A LDR r2,[r3,#0x00] ; we loop here 0x00600202 2A00 CMP r2,#0x00 0x00600204 681A LDR r2,[r3,#0x00] 0x00600206 D1FC BNE 0x00600202 これは8サイクルです 0x00600200 681A LDR …
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.