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

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

2
L2 HWプリフェッチャーは本当に役に立ちますか?
私はWhisky Lake i7-8565Uで、512 KiBのデータ(L2キャッシュサイズの2倍)をコピーするためのパフォーマンスカウンターと時間を分析しており、L2 HWプリフェッチャーの作業に関して誤解に直面しています。 でインテル・マニュアル第4巻MSR MSRがある0x1A4ビット0(無効にする1)L2 HWプリフェッチャをcontrolloingするためのものであるの。 次のベンチマークを検討してください。 memcopy.h: void *avx_memcpy_forward_lsls(void *restrict, const void *restrict, size_t); memcopy.S: avx_memcpy_forward_lsls: shr rdx, 0x3 xor rcx, rcx avx_memcpy_forward_loop_lsls: vmovdqa ymm0, [rsi + 8*rcx] vmovdqa [rdi + rcx*8], ymm0 vmovdqa ymm1, [rsi + 8*rcx + 0x20] vmovdqa [rdi + rcx*8 + 0x20], ymm1 …

2
Excel / SharedStringsのソートアルゴリズム
Excelでは、数値マッピングに文字列を「圧縮」します(この場合、圧縮という単語が正しいかどうかはわかりません)。以下に例を示します。 これは全体的なファイルサイズとメモリフットプリントを削減するのに役立ちますが、Excelは文字列フィールドでどのように並べ替えを行うのですか?すべての単一の文字列はルックアップマッピングを通過する必要がありますか。そうであれば、文字列フィールドでのソートのコストが大幅に増加したり、速度が低下したりすることはありません(1Mの値があった場合、1Mのキールックアップは行われません)。ささいな)。これに関する2つの質問: 共有文字列はExcelアプリケーション自体の中で使用されていますか、それともデータを保存するときだけですか? では、フィールドで並べ替えるアルゴリズムの例は何でしょうか?どの言語でも問題ありません(c、c#、c ++、python)。

1
多次元配列でRakuのパフォーマンスが低下するのはなぜですか?
Rakuが多次元配列の操作をそれほどうまく実行できないのはなぜでしょうか。Python、C#、Rakuで2次元マトリックスを初期化する簡単なテストを行ったところ、経過時間が驚くほど長くなりました。 楽のために my @grid[4000;4000] = [[0 xx 4000] xx 4000]; # Elapsed time 42 seconds !! Pythonの場合 table= [ [ 0 for i in range(4000) ] for j in range(4000) ] # Elapsed time 0.51 seconds C# int [,]matrix = new int[4000,4000]; //Just for mimic same behaviour for(int i=0;i<4000;i++) for(int …
10 performance  raku 

1
軸の現在表示されている領域にいるアーティストを確認する方法はmatplotlibにありますか?
インタラクティブフィギュアを使ったプログラムで、たまに多くのアーティストが描かれることがあります。この図では、マウスを使用してズームおよびパンすることもできます。ただし、パンのズーム中のパフォーマンスは、すべてのアーティストが常に再描画されるため、あまり良くありません。現在表示されている領域にいるアーティストを確認して、それらを再描画する方法はありますか?(以下の例では、パフォーマンスはまだ比較的良好ですが、より複雑なアーティストを使用することで、パフォーマンスを任意に悪化させることができます) このhoverメソッドには、呼び出されるたびにcanvas.draw()最後に実行されるという同様のパフォーマンス問題がありました。しかし、ご覧のとおり、キャッシングを利用し、(これに基づいて)軸の背景を復元することで、その適切な回避策を見つけました。これによりパフォーマンスが大幅に向上し、多くのアーティストでも非常にスムーズに動作します。多分これを行うための同様の方法がありますが、panand zoomメソッドについては? 長いコードのサンプルで申し訳ありませんが、そのほとんどは質問に直接関連していませんが、実際の例が問題を強調するために必要です。 編集 MWEを実際のコードをよりよく表すものに更新しました。 import numpy as np import numpy as np import sys import matplotlib.pyplot as plt from matplotlib.backends.backend_qt5agg import \ FigureCanvasQTAgg import matplotlib.patheffects as PathEffects from matplotlib.text import Annotation from matplotlib.collections import LineCollection from PyQt5.QtWidgets import QApplication, QVBoxLayout, QDialog def check_limits(base_xlim, base_ylim, new_xlim, new_ylim): if new_xlim[0] …

2
Cortex-A72で-O3ではなく-O0を使用した単純なタイトループのサイクルでこの高い変動が発生する原因は何ですか?
コードの一部に対して非常に一貫性のあるランタイムを取得するためにいくつかの実験を行っています。私が現在計時しているコードは、かなり恣意的なCPUバウンドのワークロードです。 int cpu_workload_external_O3(){ int x = 0; for(int ind = 0; ind < 12349560; ind++){ x = ((x ^ 0x123) + x * 3) % 123456; } return x; } 割り込みを無効にし、上記の関数の10回の試行を実行するカーネルモジュールを作成しました。各試行のタイミングは、前後のクロックサイクルカウンターの差をとることによって計っています。その他の注意事項: マシンはARM Cortex-A72であり、それぞれ4コアの4ソケット(それぞれに独自のL1キャッシュがある) クロック周波数スケーリングはオフです ハイパースレッディングはサポートされていません マシンは、一部の最低限のシステムプロセスを除いて、実質的に何も実行していません 言い換えると、システム変動のほとんど/すべての原因が説明されていると私は信じています。特に、割り込みを無効にしてカーネルモジュールとして実行した場合spin_lock_irqsave()、コードは実行間でほぼ同じパフォーマンスを達成するはずです(たぶん小さなパフォーマンスヒット)最初の実行では、いくつかの命令が最初にキャッシュにプルされますが、それだけです)。 実際、ベンチマークされたコードがでコンパイルされた場合、-O3平均で〜135,845,192のうち最大で200サイクルの範囲があり、ほとんどの試行でまったく同じ時間がかかりました。ただし、を使用してコンパイルする-O0と、範囲は262,710,916のうち158,386サイクルまで増加します。範囲とは、最長実行時間と最短実行時間の差を意味します。さらに、-O0コードでは、どの試行が最も遅い/最も速いかについて一貫性があまりありません-直感的には、ある場合には、最も速いものが最初であり、最も遅いものが直後のものでした! それで、-O0コードの変動性のこの高い上限を引き起こしている可能性があるものは何ですか?アセンブリを見ると、-O3コードはすべて(?)をレジスタに格納しているようですが、-O0コードにはたくさんの参照spがあるため、メモリにアクセスしているようです。しかし、それでも、すべてがL1キャッシュに取り込まれ、かなり確定的なアクセス時間でそこに座っていることが期待されます。 コード ベンチマーク対象のコードは上記のスニペットにあります。組み立ては下にあります。とgcc 7.4.0以外はフラグなしでコンパイルされました。-O0-O3 -O0 0000000000000000 <cpu_workload_external_O0>: 0: d10043ff sub sp, sp, …

4
リスト内のリストが同等であるかどうかを確認するより速い方法はありますか?
ここでは1:7、4つの異なるパーティション、つまり{1}、{2,3,4}、{5,6}、および{7}の整数があり、それらのパーティションはリストに書き込まれlist(1,c(2,3,4),c(5,6),7)ます。1つのパーティション内の要素の異なる順列が同じものとして認識されるように、パーティションをセットとして扱います。たとえば、list(1,c(2,3,4),c(5,6),7)とlist(7,1,c(2,3,4),c(6,5))同等です。 この問題はセット全体の排他的パーティションについて説明しているため、リスト内の要素(noなど)の繰り返しはありませんlist(c(1,2),c(2,1),c(1,2))。 以下のように、いくつかの異なる順列をリストにリストしlstました lst <- list(list(1,c(2,3,4),c(5,6),7), list(c(2,3,4),1,7,c(5,6)), list(1,c(2,3,4),7,c(6,5)), list(7,1,c(3,2,4),c(5,6))) そして、私がしたいことは、すべての順列が同等であることを確認することです。はいの場合、結果を取得しTRUEます。 私はこれまでやったことは、各パーティション内の要素をソートし、かつ使用することであるsetdiff()とinterset()し、union()それを判断する(下の私のコードを参照してください) s <- Map(function(v) Map(sort,v),lst) equivalent <- length(setdiff(Reduce(union,s),Reduce(intersect,s),))==0 ただし、パーティションサイズが大きくなると、この方法は遅くなると思います。それを作るためのより速いアプローチはありますか?事前に感謝! 一部のテストケース(小さいサイズのデータ​​) # should return `TRUE` lst1 <- list(list(1,c(2,3,4),c(5,6)), list(c(2,3,4),1,c(5,6)), list(1,c(2,3,4),c(6,5))) # should return `TRUE` lst2 <- list(list(1:2, 3:4), list(3:4, 1:2)) # should return `FALSE` lst3 <- list(list(1,c(2,3,4),c(5,6)), list(c(2,3,4),1,c(5,6)), list(1,c(2,3,5),c(6,4)))

1
この場合にconstを使用するオーバーヘッドを説明できるものは何ですか?
私はここの壁に頭をぶつけているので、あなたの何人かが私を教育することができるかもしれないことを願っています。私はBenchmarkDotNetを使用していくつかのパフォーマンスベンチマークを行っていましたが、メンバーを宣言するとconstパフォーマンスが大幅に低下すると思われるこの奇妙なケースに遭遇しました。 using BenchmarkDotNet.Attributes; using BenchmarkDotNet.Running; using System; namespace PerfTest { [DisassemblyDiagnoser(printAsm: true, printSource: true)] public class Test { private int[] data; private int Threshold = 90; private const int ConstThreshold = 90; [GlobalSetup] public void GlobalSetup() { data = new int[1000]; var random = new Random(42); for (var i = …

3
Rで文字列の文字を効率的に並べ替える方法
ベクター内の各文字列の文字を効率的に並べ替えるにはどうすればよいですか?たとえば、文字列のベクトルが与えられた場合: set.seed(1) strings <- c(do.call(paste0, replicate(4, sample(LETTERS, 10000, TRUE), FALSE)), do.call(paste0, replicate(3, sample(LETTERS, 10000, TRUE), FALSE)), do.call(paste0, replicate(2, sample(LETTERS, 10000, TRUE), FALSE))) 各文字列をベクトルに分割し、ベクトルを並べ替えて、出力を折りたたむ関数を作成しました。 sort_cat <- function(strings){ tmp <- strsplit(strings, split="") tmp <- lapply(tmp, sort) tmp <- lapply(tmp, paste0, collapse = "") tmp <- unlist(tmp) return(tmp) } sorted_strings <- sort_cat(strings) ただし、これを適用する必要がある文字列のベクトルは非常に長く、この関数は遅すぎます。パフォーマンスを改善する方法について何か提案はありますか?

1
sqrtsd命令のレイテンシが入力に基づいて変化するのはなぜですか?Intelプロセッサ
まあ上でインテル固有のガイドには、「sqrtsd」と呼ばれる命令は18サイクルのレイテンシーを持っていることが述べられています。 私はそれを自分のプログラムでテストしました。たとえば、0.15を入力として受け取った場合は正しいです。しかし、256(または任意の2 ^ x)の数をとると、レイテンシはわずか13になります。なぜですか? 私が持っていた1つの理論は、13は「sqrtss」のレイテンシであり、「sqrtsd」と同じですが32ビット浮動小数点で行われるため、プロセッサは256ビットが32ビットに適合し、そのバージョンを使用することを理解するのに十分スマートであるということです一方、0.15は有限の方法で表現できないため、完全な64ビットが必要です。 私はインラインアセンブリを使用してそれをやっています、これはgcc -O3と-fno-tree-vectorizeでコンパイルされた関連部分です。 static double sqrtsd (double x) { double r; __asm__ ("sqrtsd %1, %0" : "=x" (r) : "x" (x)); return r; }

2
複数のアレイにわたる2つの数値間の最大平均距離
あなたが持っていると言うkサイズの配列Nから一意の値それぞれ含有1するがN。 平均してお互いに最も離れている2つの数値をどのように見つけますか? たとえば、次の配列があるとします。 [1,4,2,3] [4,2,3,1] [2,3,4,1] 最初の2つの配列では距離が2離れており、最後の配列では3つの数値が離れているため、答えはitem 1と2になります。 私はO(kN ^ 2)解を知っています(各k配列の数値の各ペア間の距離を測定することによって)が、より良い解決策はありますか? このようなアルゴリズムをC ++で実装したいのですが、ソリューションの説明があれば役に立ちます。

2
スパース下三角線形システムの後方解決の最適化
主対角線上にゼロがあるnxn下三角行列Aの圧縮スパース列(csc)表現があり、bを (A + I)' * x = b これは私がこれを計算するために持っているルーチンです: void backsolve(const int*__restrict__ Lp, const int*__restrict__ Li, const double*__restrict__ Lx, const int n, double*__restrict__ x) { for (int i=n-1; i>=0; --i) { for (int j=Lp[i]; j<Lp[i+1]; ++j) { x[i] -= Lx[j] * x[Li[j]]; } } } したがって、bは引数を介して渡さxれ、ソリューションによって上書きされます。Lp、Li、Lxそれぞれスパース行列の標準CSC表現の行、インデックス、及びデータポインタです。この関数はプログラムの一番上のホットスポットで、次の行があります。 x[i] -= Lx[j] * …

4
スクロールアルゴリズム—データのフェッチと表示の改善
理論的な問題について少し述べたいと思います。 私が無限のスクロールを持っていて、ここで説明されているようなものを実装したとします:https : //medium.com/frontend-journeys/how-virtual-infinite-scrolling-works-239f7ee5aa58。特別なことは何もありません。それは、データのテーブル、たとえばNxNであると言えば十分です。ユーザーは、スプレッドシートのように、右下にスクロールでき、現在のビューとマイナスのデータのみを表示します。扱う。 ここで、次のような関数を使用して、そのビューでデータを「フェッチして表示」するのに約10ミリ秒かかるとしましょう。 get_data(start_col, end_col, start_row, end_row); これは、スクロールバーのどこかをクリックするか、必要なデータをレンダリングするために「わずかにスクロール」するときに即座に読み込まれます。ただし、すべての「未完了のフェッチイベント」について、必要なビューデータのレンダリングに2倍の時間がかかると仮定します(メモリ、GC、その他いくつかの理由により)。したがって、ゆっくりと意図的に左から右にスクロールすると、データのロードをトリガーする100以上のスクロールイベントが生成される可能性があります-最初は著しく遅延はありません。フェッチは10ミリ秒未満で発生しますが、すぐに20ミリ秒、次に40ミリ秒かかり、必要なデータをロードするために1秒以上かかるまで、かなりの遅延が発生します。さらに、デバウンス/遅延のようなものは使用できません。 どのような考慮事項を考慮に入れる必要があり、これを実現するためのサンプルアルゴリズムはどのように見えますか?これは、10000 x 10000のスプレッドシート(​​Excelはすべてのデータを一度に読み込むことができます)を想定した、データに対するユーザー操作の例です-https://gyazo.com/0772f941f43f9d14f884b7afeac9f414。

1
誰もがこの予期しないV8 JavaScriptパフォーマンス動作を説明できますか?
更新(2020年3月2日) ここでの私の例のコーディングは、V8 JavaScriptエンジンの既知のパフォーマンスの崖から落ちるように正しい方法で構成されていることがわかります... 詳細については、bugs.chromium.orgに関する議論を参照してください。このバグは現在取り組んでおり、近い将来に修正される予定です。 アップデート(2020年1月9日) 以下で説明するように動作するコーディングを単一ページのWebアプリに分離しようとしましたが、そうすると、動作が消えました(??)。ただし、以下に説明する動作は、完全なアプリケーションのコンテキストではまだ存在します。 とはいえ、私はフラクタル計算コーディングを最適化しており、この問題はライブバージョンでは問題ではなくなりました。誰かが興味を持っているなら、この問題を明らかにするJavaScriptモジュールはまだここで利用可能です 概観 ブラウザベースのJavaScriptとWebアセンブリのパフォーマンスを比較するための小さなWebベースのアプリを完成させました。このアプリはマンデルブロ集合の画像を計算し、その画像の上にマウスポインターを移動すると、対応するジュリア集合が動的に計算され、計算時間が表示されます。 JavaScript(「j」を押す)またはWebAssembly(「w」を押す)の使用を切り替えて、計算を実行し、ランタイムを比較できます。 ここをクリックして、動作するアプリを確認してください ただし、このコードを作成する際に、予期しない奇妙なJavaScriptパフォーマンス動作がいくつか見つかりました... 問題の概要 この問題は、ChromeとBraveで使用されているV8 JavaScriptエンジンに固有のようです。この問題は、SpiderMonkey(Firefox)またはJavaScriptCore(Safari)を使用するブラウザでは発生しません。チャクラエンジンを使用しているブラウザでこれをテストできませんでした このWebアプリのすべてのJavaScriptコードはES6モジュールとして記述されています function新しいES6矢印構文ではなく、従来の構文を使用してすべての関数を書き直してみました。残念ながら、これはそれほど大きな違いはありません パフォーマンスの問題は、JavaScript関数が作成されるスコープに関連しているようです。このアプリでは、2つの部分関数を呼び出し、それぞれが別の関数を返します。次に、これらの生成された関数を、ネストされたforループ内で呼び出される別の関数に引数として渡します。 forループが実行される関数と比較すると、ループは独自のスコープに似たものを作成しているように見えます(ただし、本格的なスコープはわかりません)。次に、このスコープ(?)の境界を越えて生成された関数を渡すと、負荷が高くなります。 基本的なコーディング構造 各部分関数は、マンデルブロ集合イメージ上のマウスポインターの位置のXまたはY値を受け取り、対応するジュリア集合を計算するときに反復される関数を返します。 const makeJuliaXStepFn = mandelXCoord => (x, y) => mandelXCoord + diffOfSquares(x, y) const makeJuliaYStepFn = mandelYCoord => (x, y) => mandelYCoord + (2 * x * y) これらの関数は、次のロジック内で呼び出されます。 ユーザーは、mousemoveイベントをトリガーするマンデルブロ集合の画像の上にマウスポインターを移動します …

1
Entity Framework Core 3.0のパフォーマンスへの影響(コレクションナビゲーションプロパティを含む)(デカルト爆発)
EF Core 2.2をEF Core 3.0にアップグレードした後、大きなパフォーマンスの問題に直面しています。単一のコレクションナビゲーションプロパティと数百のフィールドを持つ単純なデータモデルを想像してみてください(現実はさらに暗く見えます)。 public class Item { [Key] public int ItemID {get;set;} public ICollection<AddInfo> AddInfos {get;set;} ... // consisting of another 100+ properties! } そして public class AddInfo { [Key] public int AddInfoID {get;set;} public int? ItemID {get;set;} public string SomePayload {get;set;} } アイテムの取得中、次のようにクエリを実行します。 ... var myQueryable = …

1
拡張代入を使用する組み込みの `sum()`に相当するものはありますか?
次の関数に相当する標準ライブラリ/ numpyがありますか? def augmented_assignment_sum(iterable, start=0): for n in iterable: start += n return start ? 一方でsum(ITERABLE)非常にエレガントで、それが使用する+演算子を代わりに+=した場合にどの、np.ndarrayオブジェクトのパフォーマンスに影響を与える可能性があります。 私は私の機能が同じくらい速いかもしれないことをテストしましたsum()(それと同等の使用+ははるかに遅いです)。それは純粋なPython関数なので、そのパフォーマンスはまだハンディキャップがあると思います。したがって、いくつかの代替策を探しています。 In [49]: ARRAYS = [np.random.random((1000000)) for _ in range(100)] In [50]: def not_augmented_assignment_sum(iterable, start=0): ...: for n in iterable: ...: start = start + n ...: return start ...: In [51]: %timeit not_augmented_assignment_sum(ARRAYS) …

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