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

最適化とは、方法または設計を改善することです。プログラミングでは、最適化は通常、アルゴリズムの速度を上げるか、必要なリソースを減らすという形を取ります。最適化のもう1つの意味は、機械学習で使用される数値最適化アルゴリズムです。

26
ソートされた配列を処理する方が、ソートされていない配列を処理するよりも速いのはなぜですか?
OverаэтотвопросестьответынаStack Overflowнарусском:Почемуотсортированныймассивобрабатов、еессененеренененеререненееетсябыстре 以下は、非常に奇妙な動作を示すC ++コードの一部です。奇妙な理由で、データを奇妙にソートすると、コードがほぼ6倍速くなります。 #include <algorithm> #include <ctime> #include <iostream> int main() { // Generate data const unsigned arraySize = 32768; int data[arraySize]; for (unsigned c = 0; c < arraySize; ++c) data[c] = std::rand() % 256; // !!! With this, the next loop runs faster. std::sort(data, data + arraySize); …

30
JavaScriptリンクに使用する「href」値は、「#」または「javascript:void(0)」ですか?
以下は、JavaScriptコードを実行することのみを目的としたリンクを作成する2つの方法です。機能、ページの読み込み速度、検証目的などの点でどちらが優れていますか? function myJsFunc() { alert("myJsFunc"); } <a href="#" onclick="myJsFunc();">Run JavaScript Code</a> コードスニペットを実行する結果を非表示スニペットを展開 または function myJsFunc() { alert("myJsFunc"); } <a href="javascript:void(0)" onclick="myJsFunc();">Run JavaScript Code</a> コードスニペットを実行する結果を非表示スニペットを展開

10
SQLiteの1秒あたりのINSERTパフォーマンスを向上させる
SQLiteの最適化には注意が必要です。Cアプリケーションの一括挿入のパフォーマンスは、1秒あたり85挿入から1秒あたり96,000挿入を超える場合があります。 背景: SQLiteをデスクトップアプリケーションの一部として使用しています。大量の構成データがXMLファイルに格納されており、アプリケーションが初期化されるときに解析され、SQLiteデータベースにロードされてさらに処理されます。SQLiteは高速であり、特別な構成を必要とせず、データベースは単一のファイルとしてディスクに保存されるため、この状況に最適です。 理論的根拠: 最初は私が見ているパフォーマンスにがっかりしました。SQLiteのパフォーマンスは、データベースの構成方法とAPIの使用方法に応じて(一括挿入と選択の両方で)大きく異なる可能性があることがわかりました。すべてのオプションと手法が何であるかを理解することは簡単なことではなかったので、同じコミュニティのWikiエントリを作成してスタックオーバーフローリーダーと結果を共有し、同じ調査の問題を他の人に知らせるのは賢明だと思いました。 実験:一般的なパフォーマンスのヒント(つまり、「トランザクションを使用する!」)について単に話すのではなく、Cコードを記述して実際にさまざまなオプションの影響を測定するのが最善だと思いました。いくつかの簡単なデータから始めましょう: トロント市の完全な輸送スケジュールの28 MBのタブ区切りテキストファイル(約865,000レコード) 私のテストマシンは、Windows XPを実行する3.60 GHz P4です。 コードは、Visual C ++ 2005で「完全最適化」(/ Ox)付きの「リリース」としてコンパイルされ、高速コード(/ Ot)が優先されます。 私はテストアプリケーションに直接コンパイルされたSQLite "Amalgamation"を使用しています。私がたまたま持っているSQLiteのバージョンは少し古い(3.6.7)ですが、これらの結果は最新のリリースに匹敵すると思われます(そうでない場合はコメントを残してください)。 コードを書いてみましょう! コード:テキストファイルを1行ずつ読み取り、文字列を値に分割し、データをSQLiteデータベースに挿入する単純なCプログラム。この「ベースライン」バージョンのコードでは、データベースが作成されますが、実際にはデータを挿入しません。 /************************************************************* Baseline code to experiment with SQLite performance. Input data is a 28 MB TAB-delimited text file of the complete Toronto Transit System schedule/route info from http://www.toronto.ca/open/datasets/ttc-routes/ **************************************************************/ …

30
整数の平方根が整数かどうかを判断する最も速い方法
long値が完全な二乗かどうか(つまり、その平方根が別の整数かどうか)を判断する最も速い方法を探しています。 私は組み込みMath.sqrt() 関数を使用して簡単な方法で実行しましたが、整数のみのドメインに制限することでより速く実行する方法があるかどうか疑問に思っています。 ルックアップテーブルを維持することは非現実的です(二乗が2 63未満の整数が約2 31.5 個あるため)。 ここに私が今やっている非常にシンプルで簡単な方法があります: public final static boolean isPerfectSquare(long n) { if (n < 0) return false; long tst = (long)(Math.sqrt(n) + 0.5); return tst*tst == n; } 注:この関数は、多くのプロジェクトオイラー問題で使用しています。したがって、他の誰もこのコードを保守する必要はありません。そして、この種のマイクロ最適化は実際に違いをもたらす可能性があります。課題の一部はすべてのアルゴリズムを1分未満で実行することであり、この関数はいくつかの問題では何百万回も呼び出される必要があるためです。 私は問題のさまざまな解決策を試しました: 徹底的なテスト0.5の結果、少なくとも私のマシンでは、Math.sqrt()の結果に追加する必要がないことがわかりました。 平方根逆高速は速かったが、それは、n> = 410881.に対して誤った結果を与えたが、によって提案されたようBobbyShaftoe、我々はN <410881のためFISRハックを使用することができます。 ニュートンの方法は、に比べてかなり遅いですMath.sqrt()。これはおそらく、Math.sqrt()ニュートンの方法に似たものを使用しているためですが、ハードウェアに実装されているため、Javaよりもはるかに高速です。また、ニュートンの方法では、依然としてdoubleの使用が必要でした。 整数演算のみが関与するようにいくつかのトリックを使用した修正ニュートン法は、オーバーフローを回避するためにいくつかのハックを必要とし(この関数をすべての正の64ビット符号付き整数で機能させたい)、それでもは遅くなりましたMath.sqrt()。 バイナリチョップはさらに遅くなりました。バイナリチョップは、64ビット数の平方根を見つけるために平均で16パスを必要とするため、これは理にかなっています。 ジョンのテストによると、使用してorステートメントは、より高速なC ++で使用するよりもあるswitchが、JavaやC#での間に違いはないようであるorとswitch。 (64のブール値のプライベート静的配列として)ルックアップテーブルを作成してみました。次に、switchやorstatementの代わりに、とだけ言いif(lookup[(int)(n&0x3F)]) { test } else return …

5
HTMLの「ロール」属性の目的は何ですか?
一部の人の仕事には、役割の属性が見られます。私も使っていますが、効果はわかりません。 例えば: <header id="header" role="banner"> Header stuff in here </header> または: <section id="facebook" role="contentinfo"> Facebook stuff in here </section> または: <section id="main" role="main"> Main content stuff in here </section> この役割属性は必要ですか? この属性はセマンティクスに適していますか? それはSEOを改善しますか? 役割のリストはこちらにありますが、自分で作成する人もいます。それは許可されていますか、それとも役割属性の正しい使用ですか? これについて何か考えはありますか?
1165 html  optimization  seo  roles 


11
Collat​​z予想を手書きのアセンブリよりも速くテストするためのC ++コード-なぜですか?
Project Euler Q14のこれら2つのソリューションは、アセンブリとC ++で作成しました。これらは、Collat​​z予想をテストするための同じ同一の力ずくのアプローチです。組み立てソリューションは、 nasm -felf64 p14.asm && gcc p14.o -o p14 C ++は g++ p14.cpp -o p14 アセンブリ、 p14.asm section .data fmt db "%d", 10, 0 global main extern printf section .text main: mov rcx, 1000000 xor rdi, rdi ; max i xor rsi, rsi ; i l1: dec …

4
サイクルあたりの4つのFLOPの理論的な最大値を達成するにはどうすればよいですか?
最新のx86-64 Intel CPUで、サイクルあたり4つの浮動小数点演算(倍精度)の理論上のピークパフォーマンスをどのように達成できますか? 私が理解している限り、最新のIntel CPUのほとんどでSSE が完了addするmulまでに3サイクル、が完了するまでに5サイクルかかります(たとえば、Agner Fogの「Instruction Tables」を参照)。パイプライン化によりadd、アルゴリズムに少なくとも3つの独立した合計がある場合、1サイクルあたり1のスループットが得られます。これは、パックaddpdされたaddsdバージョンとスカラーバージョンおよびSSEレジスターに2を含めることができるため当てはまるためdouble、スループットはサイクルあたり2フロップと同じくらい高くなる可能性があります。 さらに、(これに関する適切なドキュメントを見たことはありませんが)addとmulは並行して実行でき、サイクルあたり4フロップの理論的な最大スループットを実現できます。 ただし、単純なC / C ++プログラムではそのパフォーマンスを再現できませんでした。私の最善の試みは約2.7フロップ/サイクルをもたらしました。ピークパフォーマンスを実証する単純なC / C ++またはアセンブラープログラムを提供できる人がいれば、高く評価されます。 私の試み: #include <stdio.h> #include <stdlib.h> #include <math.h> #include <sys/time.h> double stoptime(void) { struct timeval t; gettimeofday(&t,NULL); return (double) t.tv_sec + t.tv_usec/1000000.0; } double addmul(double add, double mul, int ops){ // Need to initialise differently …

30
最後の手段のパフォーマンス最適化戦略[終了]
休業。この質問には、より焦点を当てる必要があります。現在、回答を受け付けていません。 この質問を改善してみませんか?質問を更新して、この投稿を編集するだけで1つの問題に焦点を当てます。 6年前休業。 このサイトにはすでにパフォーマンスに関する質問がたくさんありますが、ほとんどすべてが非常に問題固有であり、かなり狭いと思います。そして、ほとんどすべてが時期尚早な最適化を避けるためにアドバイスを繰り返します。 仮定しましょう: コードはすでに正しく機能しています 選択したアルゴリズムは、問題の状況にすでに最適です コードが測定され、問題のあるルーチンが分離されている 最適化のすべての試みは、問題を悪化させないように測定されます 私がここで探しているのは、重要なアルゴリズムで最後の数パーセントまで絞り出すための戦略とトリックです。 理想的には、回答を言語にとらわれないようにし、該当する場合は提案された戦略の欠点を示してください。 私は自分の最初の提案とともに返信を追加し、Stack Overflowコミュニティが他に考えられることを楽しみにしています。


30
浮動小数点と二重比較の最も効果的な方法は何ですか?
2つdoubleまたは2つのfloat値を比較する最も効率的な方法は何でしょうか? これを行うだけでは正しくありません。 bool CompareDoubles1 (double A, double B) { return A == B; } しかし、次のようなもの: bool CompareDoubles2 (double A, double B) { diff = A - B; return (diff < EPSILON) && (-diff < EPSILON); } 処理を無駄にしているようです。 誰かがよりスマートなフロート比較器を知っていますか?

30
チャンクのリストを反復する最も「パイソン的な」方法は何ですか?
入力として整数のリストを受け取るPythonスクリプトがあり、一度に4つの整数を処理する必要があります。残念ながら、私は入力を制御できません。または、4要素のタプルのリストとして渡されます。現在、私はそれをこのように繰り返しています: for i in xrange(0, len(ints), 4): # dummy op for example code foo += ints[i] * ints[i + 1] + ints[i + 2] * ints[i + 3] それは「C-think」によく似ていますが、この状況に対処するためのよりパイソン的な方法があるのではないかと思います。リストは反復後に破棄されるため、保持する必要はありません。おそらく、このようなものが良いでしょうか? while ints: foo += ints[0] * ints[1] + ints[2] * ints[3] ints[0:4] = [] ただし、それでも「気分」はよくありません。:-/ 関連質問:Pythonではどのようにリストを均等なサイズのチャンクに分割しますか?


30
リストの不規則なリストをフラット化する
OverаэтотвопросестьответынаStack Overflowнарусском:Сделатьглубоковложенныйсписокплоскимбезветвле はい、私はこの主題が以前にカバーされたことを知っていますが(ここ、ここ、ここ、ここ、ここ)、私が知る限り、1つを除くすべてのソリューションは次のようなリストで失敗します: L = [[[1, 2, 3], [4, 5]], 6] 必要な出力がある場所 [1, 2, 3, 4, 5, 6] あるいは、おそらくもっと良いのはイテレータです。任意のネストで機能することがわかった唯一の解決策は、この質問にあります: def flatten(x): result = [] for el in x: if hasattr(el, "__iter__") and not isinstance(el, basestring): result.extend(flatten(el)) else: result.append(el) return result flatten(L) これは最高のモデルですか?見落としましたか?何か問題は?


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.