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

コードおよびアプリケーション効率の測定または改善に関する質問。

30
開発者は、最初に読みやすさやパフォーマンスを目指す必要がありますか?[閉まっている]
現在のところ、この質問は私たちのQ&A形式には適していません。回答は事実、参考資料、または専門知識によって裏付けられることを期待していますが、この質問は、討論、議論、世論調査、または広範な議論を求める可能性があります。この質問を改善し、場合によっては再開できると思われる場合は、ヘルプセンターにアクセスしてガイダンスを入手してください。 7年前に閉鎖されました。 多くの場合、開発者は、問題を解決するための2つの可能な方法から選択する必要があります。1つは慣用的で読みやすい方法で、もう1つは直感的ではないがパフォーマンスが向上する可能性があります。たとえば、Cベースの言語では、数値に2を掛ける方法は2つあります。 int SimpleMultiplyBy2(int x) { return x * 2; } そして int FastMultiplyBy2(int x) { return x << 1; } 最初のバージョンは、テクニカルリーダーと非テクニカルリーダーの両方で簡単に選択できますが、ビットシフトは乗算よりも簡単な操作であるため、2番目のバージョンの方がパフォーマンスが向上する可能性があります。(今のところ、コンパイラのオプティマイザがこれを検出して最適化しないと仮定しましょう。ただし、これも考慮事項です)。 開発者として、最初の試みとしてどちらが良いでしょうか?

12
javaメソッド呼び出しのコスト
私は初心者で、コードを繰り返すのは悪いことだといつも読んでいます。ただし、そうしないためには、通常、追加のメソッド呼び出しが必要になるようです。次のクラスがあるとしましょう public class BinarySearchTree<E extends Comparable<E>>{ private BinaryTree<E> root; private final BinaryTree<E> EMPTY = new BinaryTree<E>(); private int count; private Comparator<E> ordering; public BinarySearchTree(Comparator<E> order){ ordering = order; clear(); } public void clear(){ root = EMPTY; count = 0; } } 実際のメソッドを呼び出す代わりに、clear()メソッドの2行をコピーしてコンストラクターに貼り付ける方が最適でしょうか?もしそうなら、それはどのくらいの違いを生むのでしょうか?コンストラクターが10回のメソッド呼び出しを行い、それぞれがインスタンス変数を値に設定するだけの場合はどうなりますか?プログラミングのベストプラクティスは何ですか?

12
Python-リストの単調性をチェックする方法
リストの単調性をチェックするための効率的でPythonの方法は何でしょうか?つまり、値が単調に増加または減少しているということですか? 例: [0, 1, 2, 3, 3, 4] # This is a monotonically increasing list [4.3, 4.2, 4.2, -2] # This is a monotonically decreasing list [2, 3, 1] # This is neither

9
2つの画面のいずれかでのDataGridViewのひどい再描画パフォーマンス
私は実際にこれを解決しましたが、後世のために投稿しています。 デュアルモニターシステムのDataGridViewで非常に奇妙な問題が発生しました。この問題は、コントロールの再描画が非常に遅い(完全な再描画の場合は30秒など)として現れますが、それが私の画面の1つにある場合に限ります。一方、再描画速度は問題ありません。 私は最新の非ベータドライバー(175.何か)を搭載したNvidia 8800GTを持っています。ドライバーのバグですか?私はこの特定の構成で生きなければならないので、それを空中に残しておきます。(ただし、ATIカードでは発生しません...) ペイント速度はセルの内容とは関係ありません。カスタム描画では、塗りつぶされた長方形をペイントするだけでも、パフォーマンスはまったく向上しません。 後で、(System.Windows.Forms.Integration名前空間からの)ElementHostをフォームに配置すると問題が修正されることがわかりました。それを台無しにする必要はありません。DataGridViewもオンになっているフォームの子である必要があります。Visibleプロパティがtrueである限り、サイズを(0、0)に変更できます。 .NET 3 /3.5の依存関係をアプリケーションに明示的に追加したくありません。リフレクションを使用して、実行時に(可能であれば)このコントロールを作成するメソッドを作成します。それは機能し、少なくとも必要なライブラリがないマシンでは正常に失敗します-ただ遅い状態に戻ります。 この方法では、アプリの実行中に修正を適用することもでき、フォームでWPFライブラリがどのように変更されているかを簡単に確認できます(Spy ++を使用)。 多くの試行錯誤の末、(フォームだけでなく)コントロール自体でダブルバッファリングを有効にすると問題が修正されることに気付きました。 したがって、DataGridViewに基づいてカスタムクラスを作成するだけで、DoubleBufferingを有効にできます。それでおしまい! class CustomDataGridView: DataGridView { public CustomDataGridView() { DoubleBuffered = true; } } グリッドのすべてのインスタンスがこのカスタムバージョンを使用している限り、すべて問題ありません。これが原因でサブクラスソリューションを使用できない状況に遭遇した場合(コードがない場合)、そのコントロールをフォームに挿入しようと試みることができると思います:)(私はリフレクションを使用して、DoubleBufferedプロパティを外部から強制的にオンにして、依存関係をもう一度回避しようとする可能性が高くなります)。 こんなに単純なことが私の時間の多くを食い尽くしたのは悲しいことです...

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++) { …

1
groupbyとdistinctを使用した場合のパフォーマンスの大きな違い
HSQLDB500000エントリを含むテーブルを使用してサーバーでいくつかのテストを実行しています。テーブルにはインデックスがありません。5000の異なるビジネスキーがあります。それらのリストが必要です。当然、私はDISTINCTクエリから始めました: SELECT DISTINCT business_key FROM memory WHERE concept <> 'case' or attrib <> 'status' or value <> 'closed' 約90秒かかります!!! それから私は使ってみましたGROUP BY: SELECT business_key FROM memory WHERE concept <> 'case' or attrib <> 'status' or value <> 'closed' GROUP BY business_key そしてそれは1秒かかります!!! 私が実行した違いを理解しようとしていEXLAIN PLAN FORますが、両方のクエリで同じ情報が得られるようです。 EXLAIN PLAN FOR DISTINCT ... isAggregated=[false] …

3
Pandasのパフォーマンスは、既存の列から新しい列を作成するためにnp.vectorizeに適用されます
Pandasデータフレームを使用していて、既存の列の関数として新しい列を作成したいと思います。私はとの速度差の良い議論を見ていないdf.apply()とnp.vectorize()私は、私はここに求めるだろうと思ったので、。 パンダのapply()機能は遅いです。私が測定したもの(いくつかの実験で以下に示す)から、少なくとも私の2016 MacBook Proでは、np.vectorize()使用はDataFrame関数を使用するよりも25倍高速(またはそれ以上)ですapply()。これは期待される結果ですか、そしてその理由は何ですか? たとえば、次のN行のあるデータフレームがあるとします。 N = 10 A_list = np.random.randint(1, 100, N) B_list = np.random.randint(1, 100, N) df = pd.DataFrame({'A': A_list, 'B': B_list}) df.head() # A B # 0 78 50 # 1 23 91 # 2 55 62 # 3 82 64 # 4 99 80 さらに、2つの列Aとの関数として新しい列を作成するとしBます。以下の例では、単純な関数を使用しますdivide()。関数を適用するには、df.apply()またはのいずれかを使用できますnp.vectorize(): def …

5
何千ものEntityFrameworkオブジェクトを作成するときに、いつSaveChanges()を呼び出す必要がありますか?(インポート時のように)
実行ごとに数千のレコードを持つインポートを実行しています。私の仮定の確認を探しているだけです: これらのどれが最も理にかなっています: SaveChanges()すべてのAddToClassName()呼び出しを実行します。 n回の呼び出しSaveChanges()ごとに実行します。AddToClassName() すべての呼び出しのSaveChanges()後に実行します。AddToClassName() 最初のオプションはおそらく遅いですよね?メモリ内のEFオブジェクトを分析する必要があるため、SQLなどを生成します。 2番目のオプションは、両方の長所であると思いSaveChanges()ます。これは、その呼び出しの周りにtry catchをラップでき、一方が失敗した場合に一度にn個のレコードしか失うことができないためです。たぶん、各バッチをリスト<>に保存します。SaveChanges()呼び出しが成功した場合は、リストを削除します。失敗した場合は、アイテムをログに記録します。 最後のオプションも、SaveChanges()呼び出されるまですべてのEFオブジェクトがメモリ内にある必要があるため、おそらく非常に遅くなります。そして、保存が失敗した場合、何もコミットされませんよね?

6
速度とスケーラビリティのためにコハナベースのウェブサイトを最適化する
私がコハナで構築したサイトは昨日大量のトラフィックで非難され、一歩下がってデザインの一部を評価することになりました。コハナベースのアプリケーションを最適化するためのいくつかの標準的な手法に興味がありますか? ベンチマークにも興味があります。私はセットアップする必要がありますBenchmark::start()し、Benchmark::stop()すべてのページの実行時間を確認するために、各コントローラ-法のために、または私は世界的にかつ迅速にベンチマーク適用できるのですか? 今後、キャッシュライブラリをさらに使用する予定ですが、現時点では気付いていないことがたくさんあると確信しているので、さらに多くの提案を受け付けています。

6
Cでの最良のタイミング方法は?
高解像度と移植性を備えたコードセクションの時間を計る最良の方法は何ですか? /* Time from here */ ProcessIntenseFunction(); /* to here. */ printf("Time taken %d seconds %d milliseconds", sec, msec); クロスプラットフォームソリューションを持つ標準ライブラリはありますか?
80 c  performance  timer  timing 

3
ソートされた配列の処理が、ソートされていない配列よりも*遅い*のはなぜですか?(JavaのArrayList.indexOf)
タイトルは、ソートされていない配列よりもソートされた配列を処理する方が速いのはなぜですか? これも分岐予測効果ですか?注意:ここでは、ソートされた配列の処理が遅くなります!! 次のコードについて考えてみます。 private static final int LIST_LENGTH = 1000 * 1000; private static final long SLOW_ITERATION_MILLIS = 1000L * 10L; @Test public void testBinarySearch() { Random r = new Random(0); List<Double> list = new ArrayList<>(LIST_LENGTH); for (int i = 0; i < LIST_LENGTH; i++) { list.add(r.nextDouble()); } //Collections.sort(list); // …

1
Python:*と**が/とsqrt()よりも速いのはなぜですか?
コードを最適化しているときに、次のことに気づきました。 >>> from timeit import Timer as T >>> T(lambda : 1234567890 / 4.0).repeat() [0.22256922721862793, 0.20560789108276367, 0.20530295372009277] >>> from __future__ import division >>> T(lambda : 1234567890 / 4).repeat() [0.14969301223754883, 0.14155197143554688, 0.14141488075256348] >>> T(lambda : 1234567890 * 0.25).repeat() [0.13619112968444824, 0.1281130313873291, 0.12830305099487305] そしてまた: >>> from math import sqrt >>> T(lambda : sqrt(1234567890)).repeat() …


1
a.insert(0,0)がa [0:0] = [0]よりもはるかに遅いのはなぜですか?
リストのinsert関数を使用すると、スライス割り当てを使用して同じ効果を得るよりもはるかに遅くなります。 > python -m timeit -n 100000 -s "a=[]" "a.insert(0,0)" 100000 loops, best of 5: 19.2 usec per loop > python -m timeit -n 100000 -s "a=[]" "a[0:0]=[0]" 100000 loops, best of 5: 6.78 usec per loop (a=[]これは設定にすぎないため、a空から開始されますが、100,000要素まで増加します。) 最初は多分それは属性ルックアップか関数呼び出しのオーバーヘッドかと思ったが、最後の方に挿入するとそれは無視できることを示している: > python -m timeit -n 100000 -s "a=[]" "a.insert(-1,0)" 100000 loops, …

7
2つのゼロ引数コンストラクターを区別する慣用的な方法
私はこのようなクラスを持っています: struct event_counts { uint64_t counts[MAX_COUNTERS]; event_counts() : counts{} {} // more stuff }; 通常私countsは示されているようにデフォルト(ゼロ)配列を初期化したいと思います。 ただし、プロファイリングによって特定された特定の場所では、配列が上書きされることがわかっているため、配列の初期化を抑制したいのですが、コンパイラーはそれを理解するのに十分なほどスマートではありません。 そのような「セカンダリ」ゼロ引数コンストラクタを作成する慣用的で効率的な方法は何ですか? 現在、次のuninit_tagように、ダミー引数として渡されるタグクラスを使用しています。 struct uninit_tag{}; struct event_counts { uint64_t counts[MAX_COUNTERS]; event_counts() : counts{} {} event_counts(uninit_tag) {} // more stuff }; 次に、構築event_counts c(uninit_tag{});を抑制したいときのように、no-initコンストラクターを呼び出します。 私は、ダミークラスの作成を含まない、または何らかの方法でより効率的なソリューションなどを受け入れています。

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