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

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

4
Scalaでzipよりも速く圧縮されるのはなぜですか?
コレクションに対して要素ごとの操作を実行するためのScalaコードをいくつか記述しました。ここでは、同じタスクを実行する2つのメソッドを定義しました。1つの方法はを使用zipし、もう1つの方法はを使用しzippedます。 def ES (arr :Array[Double], arr1 :Array[Double]) :Array[Double] = arr.zip(arr1).map(x => x._1 + x._2) def ES1(arr :Array[Double], arr1 :Array[Double]) :Array[Double] = (arr,arr1).zipped.map((x,y) => x + y) 速度の点でこれら2つの方法を比較するために、次のコードを書きました。 def fun (arr : Array[Double] , arr1 : Array[Double] , f :(Array[Double],Array[Double]) => Array[Double] , itr : Int) ={ val t0 = System.nanoTime() …

1
HashSetコードの予期しない実行時間
だから、もともと、私はこのコードを持っていました: import java.util.*; public class sandbox { public static void main(String[] args) { HashSet<Integer> hashSet = new HashSet<>(); for (int i = 0; i < 100_000; i++) { hashSet.add(i); } long start = System.currentTimeMillis(); for (int i = 0; i < 100_000; i++) { for (Integer val : hashSet) { …

2
並べ替えられたグループでは、並べ替えられていないグループよりもグループ化された合計が遅いのはなぜですか?
タブ区切りの整数が2列あります。1つ目はランダムな整数、2つ目はこのプログラムで生成できるグループを識別する整数です。(generate_groups.cc) #include <cstdlib> #include <iostream> #include <ctime> int main(int argc, char* argv[]) { int num_values = atoi(argv[1]); int num_groups = atoi(argv[2]); int group_size = num_values / num_groups; int group = -1; std::srand(42); for (int i = 0; i < num_values; ++i) { if (i % group_size == 0) { ++group; …
27 c++  performance 

2
なぜkerasモデルはコンパイル後に予測が遅くなるのですか?
理論的には、重みは固定サイズであるため、予測は一定でなければなりません。コンパイル後に速度を戻すにはどうすればよいですか(オプティマイザを削除する必要はありません)。 関連する実験を参照してください:https : //nbviewer.jupyter.org/github/off99555/TensorFlowExperiments/blob/master/test-prediction-speed-after-compile.ipynb?flush_cache=true

2
Kerasの予測時間の矛盾
私のケラスモデルの予測時間の見積もりを取得しようとしたところ、奇妙なことがわかりました。通常はかなり高速であることは別にして、モデルは予測を出すのにかなり長い時間が必要です。それだけでなく、それらの時間はモデルの実行時間が長くなるほど増加します。エラーを再現するための最小限の実用例を追加しました。 import time import numpy as np from sklearn.datasets import make_classification from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Dense, Flatten # Make a dummy classification problem X, y = make_classification() # Make a dummy model model = Sequential() model.add(Dense(10, activation='relu',name='input',input_shape=(X.shape[1],))) model.add(Dense(2, activation='softmax',name='predictions')) model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy']) model.fit(X, y, verbose=0, batch_size=20, epochs=100) …

2
最初の呼び出しが遅くなるのを避けるためにJavaクラスをウォームアップする方法は?
すべてのAPI呼び出しを1秒未満で実行する必要があるプロジェクトを実行していますが、各ルートへの最初の呼び出しで、次の呼び出しよりも遅い問題に直面しています。 現在、/ loginへの最初の呼び出しには3.6秒かかり、次の呼び出しには170ミリ秒かかり、他のすべてのルートで同じです。 -XX:+TraceClassLoading最初の呼び出しでそれを使用して、クラスがメモリにロードされ、パフォーマンスの問題を引き起こしたことがわかりました。 ただし、起動時にすべてのクラスをロードする簡単な方法が見つからなかったため、新しいサービスごとに、ApplicationRunnerにウォームアップコールを追加する必要があります。 SpringBootアプリケーションのクラスを自動的にロードするか、そのすべてのルートをウォームアップするソリューションは誰にもありますか?

1
Pythonでサブクラスを作成すると、処理が非常に遅くなるのはなぜですか?
私は拡張する単純なクラスに取り組んでいて、dictキーの検索と使用pickleが非常に遅いことに気付きました。 それは自分のクラスの問題だと思ったので、いくつかの簡単なベンチマークを行いました。 (venv) marco@buzz:~/sources/python-frozendict/test$ python --version Python 3.9.0a0 (venv) marco@buzz:~/sources/python-frozendict/test$ sudo pyperf system tune --affinity 3 [sudo] password for marco: Tune the system configuration to run benchmarks Actions ======= CPU Frequency: Minimum frequency of CPU 3 set to the maximum frequency System state ============ CPU: use 1 logical CPUs: 3 …

2
Java 8:Class.getName()が文字列連結チェーンを遅くする
最近、文字列の連結に関する問題に遭遇しました。このベンチマークはそれを要約します: @OutputTimeUnit(TimeUnit.NANOSECONDS) public class BrokenConcatenationBenchmark { @Benchmark public String slow(Data data) { final Class<? extends Data> clazz = data.clazz; return "class " + clazz.getName(); } @Benchmark public String fast(Data data) { final Class<? extends Data> clazz = data.clazz; final String clazzName = clazz.getName(); return "class " + clazzName; } @State(Scope.Thread) …

2
Java:手動で展開されたループは、元のループよりも高速です。どうして?
長さ2の配列に対する次の2つのコードスニペットを考えてみます。 boolean isOK(int i) { for (int j = 0; j < filters.length; ++j) { if (!filters[j].isOK(i)) { return false; } } return true; } そして boolean isOK(int i) { return filters[0].isOK(i) && filters[1].isOK(i); } 十分なウォームアップ後、これら2つのピースのパフォーマンスは同様になるはずだと思います。ここやここなどで 説明されているように、JMHマイクロベンチマークフレームワークを使用してこれをチェックし、2番目のスニペットが10%以上高速であることを確認しました。 質問:Javaが基本的なループ展開技術を使用して最初のスニペットを最適化していないのはなぜですか? 特に、以下について理解したいと思います。 2つのフィルターの場合に最適なコードを簡単に作成できますが、別の数のフィルターの場合でも機能します(単純なビルダーを想像してください) return (filters.length) == 2 ? new FilterChain2(filters) : new FilterChain1(filters)。JITCは同じことを行うことができますか? …

2
React.forwardRefとカスタム参照プロパティを使用することの値
React.forwardRefは、react docsから、refを子機能コンポーネントに渡す認可された方法のように見えます。 const FancyButton = React.forwardRef((props, ref) => ( <button ref={ref} className="FancyButton"> {props.children} </button> )); // You can now get a ref directly to the DOM button: const ref = React.createRef(); <FancyButton ref={ref}>Click me!</FancyButton>; ただし、カスタムプロップを単に渡すよりも、これを行う利点は何ですか。 const FancyButton = ({ innerRef }) => ( <button ref={innerRef} className="FancyButton"> {props.children} </button> )); const …

3
intの剰余演算子によりjava.util.Objects.requireNonNull?
私はいくつかの内部メソッドから可能な限り多くのパフォーマンスを得ようとしています。 Javaコードは次のとおりです。 List<DirectoryTaxonomyWriter> writers = Lists.newArrayList(); private final int taxos = 4; [...] @Override public int getParent(final int globalOrdinal) throws IOException { final int bin = globalOrdinal % this.taxos; final int ordinalInBin = globalOrdinal / this.taxos; return this.writers.get(bin).getParent(ordinalInBin) * this.taxos + bin; //global parent } プロファイラーでjava.util.Objects.requireNonNull、にCPU使用率が1%あるのを見ましたが、それを呼び出すことすらしません。バイトコードを検査するとき、私はこれを見ました: public getParent(I)I throws java/io/IOException …

4
numpy.median.reduceatの高速代替
この回答に関連して、要素数が等しくないグループを持つ配列の中央値を計算する高速な方法はありますか? 例えば: data = [1.00, 1.05, 1.30, 1.20, 1.06, 1.54, 1.33, 1.87, 1.67, ... ] index = [0, 0, 1, 1, 1, 1, 2, 3, 3, ... ] そして私は、(例えば、中央値グループの数やグループごとの中央値との差異を計算したい0です1.025最初の結果があるので1.00 - 1.025 = -0.025)。したがって、上記の配列の場合、結果は次のようになります。 result = [-0.025, 0.025, 0.05, -0.05, -0.19, 0.29, 0.00, 0.10, -0.10, ...] np.median.reduceat(まだ)存在しないので、これを達成する別の高速な方法はありますか?私のアレイには数百万の行が含まれるため、速度は非常に重要です。 インデックスは連続していて順序付けられていると見なすことができます(そうでない場合は簡単に変換できます)。 パフォーマンス比較のデータ例: import numpy …

1
等しい接頭辞と接尾辞を順次削除する効率的な文字列切り捨てアルゴリズム
テストあたりの制限時間:5秒 テストあたりのメモリ制限:512メガバイト s長さの文字列n(n≤5000)が与えられます。この文字列のサフィックスでもある適切なプレフィックスを選択し、選択したプレフィックスまたは対応するサフィックスを削除できます。次に、結果の文字列に同様の操作を適用できます。そのような操作の最適なシーケンスを適用した後に達成できる最終的な文字列の最小の長さはどれくらいですか? 入力 各テストの最初の行にsは、小さな英語の文字で構成される文字列が含まれています。 出力 単一の整数を出力します—そのような操作の最適なシーケンスを適用した後に達成できる最終的な文字列の最小の長さ。 例 +-------+--------+----------------------------------+ | Input | Output | Explanation | +-------+--------+----------------------------------+ | caaca | 2 | caaca → ca|aca → aca → ac|a → ac | +-------+--------+----------------------------------+ | aabaa | 2 | aaba|a → a|aba → ab|a → ab | +-------+--------+----------------------------------+ | abc | …

1
マシンコードの正確なコピーは、元の関数よりも50%遅く実行されます
組み込みシステムのRAMとフラッシュメモリからの実行を少し試しました。迅速なプロトタイピングとテストのために、私は現在Arduino Due(SAM3X8E ARM Cortex-M3)を使用しています。私が見る限り、Arduinoランタイムとブートローダーはここでは何の違いもないはずです。 ここに問題があります:ARM Thumb Assemblyで記述された関数(calc)があります。calcは数値を計算して返します。(> 1s runtime for the given input)次に、その関数のアセンブルされたマシンコードを手動で抽出し、それを生のバイトとして別の関数に入れました。両方の機能がフラッシュメモリに存在することが確認されています(アドレス0x80149および0x8017D、隣り合っています)。これは、逆アセンブルとランタイムチェックの両方で確認されています。 void setup() { Serial.begin(115200); timeFnc(calc); timeFnc(calc2); } void timeFnc(int (*functionPtr)(void)) { unsigned long time1 = micros(); int res = (*functionPtr)(); unsigned long time2 = micros(); Serial.print("Address: "); Serial.print((unsigned int)functionPtr); Serial.print(" Res: "); Serial.print(res); Serial.print(": "); Serial.print(time2-time1); Serial.println("us"); …

2
最近のPCビデオハードウェアはHWでVGAテキストモードをサポートしていますか、それともBIOSがそれをエミュレートしますか(システム管理モードで)?
(0x31)などのバイトを物理線形アドレスのVGAテキスト(モード03)フレームバッファーに格納すると、16ビットのレガシーBIOS MBRモードで起動した最新のPCハードウェアで実際に何が起こりますか? そのリージョンのMTRRがUCに設定されているストアはどのくらい遅いですか? (Kaby Lake iGPUラップトップ1台での実験的テスト'1'B8000mov [es:di], eax、WC上のclflushoptがVGAメモリのUCとほぼ同じ速度であることを示しています。しかし、clflushopt movがないと、WCメモリへのストアはCPUを離れず、画面をまったく更新せず、超高速で実行されます。) すべてのストアのSMIではない場合、実際にリアルモードで再起動せずにパフォーマンスを実験するために、ユーザー空間のWBメモリのチャンクでこのコストを概算する方法はありますか?(たとえば、実際にはどこにも表示されないふりフレームバッファとしてBSSページを使用する)。 対応するフォントグリフは次の更新時に画面に表示されますが、ハードウェアスキャンアウトは実際にVRAM(またはiGPUの場合はDRAM)からASCII文字を読み取り、ビットマップフォントグリフに即座にマッピングしていますか?または、各ストアまたはvblankごとに1つのソフトウェアインターセプトがあるため、実際のハードウェアはビットマップフレームバッファーのみを処理する必要がありますか? レガシBIOSブートは、システム管理モード(SMM)を使用して USB kbd /マウスをPS / 2デバイスとしてエミュレートすることで知られています。VGAテキストモードのフレームバッファーにも使用されているのでしょうか。モード設定用のVGA I / Oポートに使用されていると思いますが、テキストフレームバッファがハードウェアでサポートされている可能性があります。ただし、ほとんどのコンピューターはすべての時間をグラフィックスモードで費やしているため、テキストモードのHWサポートを除外することは、ベンダーがしたいことのようです。(OTOH このブログは、自作のVerilog VGAコントローラーがテキストモードをかなり単純に実装できることを示唆しています。) 私は特にIntel SkylakeのiGPUを使用するシステムに興味がありますが、IntelおよびAMDの以前/後期のiGPU、および新旧のディスクリートGPUに興味があります。 (AMDとNVidia以外のベンダーを含みます。PCIeではなくPCIスロットを備えたSkylakeマザーボードがいくつかあります。最新のGPUファームウェアドライバーがテキストモードをエミュレートする場合、ハードウェアVGAテキストモードを備えた古いPCIビデオカードがいくつかあると考えられます。そしておそらくそのようなカードストアをSMIではなくPCIトランザクションにすることができます。) 私のデスクトップは、Asus Z170 Proゲーミングモボのi7-6700kです。アドオンカードはなく、DVI-D出力に1920x1200モニターを備えたiGPUのみです。@EldanがテストしているKaby Lake i5-7300HQシステムの詳細はわかりません。CPUモデルのみです。 私は2011年に uefiを使用してレガシービデオをエミュレートするフェニックスBIOSの特許US20120159520を見つけました。ビデオハードウェアベンダーにUEFI とネイティブの16ビットリアルモードオプションROMドライバーの両方の提供を要求する代わりに、SMMフックを介してベンダー提供のUEFIビデオドライバーを呼び出すリアルモードVGAドライバー(関数など)を提案します。int 10h 要約 [...]汎用ビデオオプションROMは、汎用ビデオSMMドライバーにビデオサービスの要求を通知します。このような通知は、ソフトウェアシステム管理割り込み(SMI)を使用して実行できます。通知されると、汎用ビデオSMMドライバーは、サードパーティのUEFIビデオドライバーにビデオサービスの要求を通知します。サードパーティのビデオドライバーは、要求されたビデオサービスをオペレーティングシステムに提供します。このようにして、サードパーティのUEFIグラフィックスドライバーは、UEFIディスプレイプロトコルをネイティブでサポートしていないオペレーティングシステムであっても、さまざまなオペレーティングシステムをサポートできます。 説明の多くは、int 10hすでに明らかにIVTを介してトラップするような呼び出しの処理をカバーしているため、意図的にSMIをトリガーするカスタムコードを簡単に実行できます。関連する部分は、ソフトウェアまたはハードウェアの割り込みをトリガーしないコードでも機能する必要があるテキストモードフレームバッファーへの直接保存について説明している部分です。(そのようなストアでSWをトリガーするHW以外、サポートされている場合は使用できると彼らは言っています。) テキストバッファのサポート 特定の実施形態では、アプリケーションは、VGAのテキストバッファを直接操作することができる。そのような実施形態では、汎用ビデオSMMドライバ130は、ハードウェアが740KB〜768KBメモリ領域(テキストバッファが配置されている)への読み取り/書き込みアクセス時にSMIトラッピングを提供するかどうかに応じて、2つの方法のうちの1つでこれをサポートする。 SMIトラッピングが利用可能な場合、ハードウェアは、各読み取りまたは書き込みアクセスでSMIを生成する。SMIトラップのトラップアドレスを使用して、正確なテキストの列と行を計算し、仮想テキスト画面の対応する行と列にアクセスできます。 代わりに、この領域では通常のメモリが有効になり、定期的なSMIを使用して、汎用ビデオSMMドライバー130はエミュレートされたハードウェアテキストバッファーの変更をスキャンし、ビデオドライバーによって維持される対応する仮想テキスト画面を更新します。どちらの場合も、変更が検出されると、文字が仮想テキスト画面に再描画されます。 これはBIOSベンダーの特許の1つに過ぎず、ほとんどのハードウェアが実際にどのように機能するか、または他のベンダーが異なることを行っているかどうかはわかりません。それは本質的にことを確認しないいくつかのハードウェアがいますが、その範囲内の店舗にどの缶トラップが存在します。(それが彼らが彼らの特許でカバーすることを決めた仮説的な可能性でない限り) 私が念頭に置いているユースケースでは、画面の更新時にのみトラップする方が、すべてのストアでトラップするよりもはるかに高速なので、どのハードウェア/ファームウェアがどのように機能するか知りたいです。 この質問の動機 第7世代Intel CoreのビデオRAMでインクリメントするASCII 10進カウンターを最適化-ASCIIテキストカウンターの新しい数字をビデオRAMの同じ数バイトに繰り返し保存します。 Linuxの32ビットユーザー空間のコードのバージョンをWBメモリでテストしました。movnti各ストアの後にCPUがWCバッファーをビデオRAMに同期するさまざまな方法(および場合によってはときどき)タイマー割り込み)。ただし、リアルモードブートローダーの状況がDRAMへの格納だけでなく、SMIをトリガーする場合、これは現実的ではありません。 WBメモリでは、movntiaを使用したスト​​アのフラッシュは、を使用したフラッシュlock …

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