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

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

3
コードが末尾呼び出しの最適化を積極的に防止しようとするのはなぜですか?
質問のタイトルは少し奇妙かもしれませんが、私が知る限り、末尾呼び出しの最適化に反対するものは何もありません。しかし、オープンソースプロジェクトを閲覧しているときに、コンパイラが末尾呼び出しの最適化を実行するのを積極的に阻止しようとするいくつかの関数にすでに遭遇しました。たとえば、そのようなハックでいっぱいのCFRunLoopRefの実装です。例えば: static void __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__() __attribute__((noinline)); static void __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__(CFRunLoopObserverCallBack func, CFRunLoopObserverRef observer, CFRunLoopActivity activity, void *info) { if (func) { func(observer, activity, info); } getpid(); // thwart tail-call optimization } なぜこれがそれほど重要に見えるのか知りたいのですが、通常の開発者として私もこれを念頭に置いておく必要がある場合はありますか?例えば。末尾呼び出しの最適化に関する一般的な落とし穴はありますか?

2
ArrayBlockingQueueで、最終メンバーフィールドをローカルの最終変数にコピーするのはなぜですか?
ではArrayBlockingQueue、ロックを必要とするすべてのメソッドは、をfinal呼び出す前にロックをローカル変数にコピーしますlock()。 public boolean offer(E e) { if (e == null) throw new NullPointerException(); final ReentrantLock lock = this.lock; lock.lock(); try { if (count == items.length) return false; else { insert(e); return true; } } finally { lock.unlock(); } } フィールドがであるときにthis.lockローカル変数lockにコピーする理由はありますか?this.lockfinal さらに、E[]アクションを実行する前にのローカルコピーも使用します。 private E extract() { final E[] items = this.items; …

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

5
Java整数compareTo()-なぜ比較と減算を使用するのですか?
私は見つけたjava.lang.Integerの実装compareToは次のような方法のルックスを: public int compareTo(Integer anotherInteger) { int thisVal = this.value; int anotherVal = anotherInteger.value; return (thisVal<anotherVal ? -1 : (thisVal==anotherVal ? 0 : 1)); } 問題は、なぜ減算の代わりに比較を使用するのかということです。 return thisVal - anotherVal;

2
スイッチがチェーン化されているのと同じように最適化されていないのはなぜですか?
次のsquareの実装は、連鎖ifステートメントに期待するような一連のcmp / jeステートメントを生成します。 int square(int num) { if (num == 0){ return 0; } else if (num == 1){ return 1; } else if (num == 2){ return 4; } else if (num == 3){ return 9; } else if (num == 4){ return 16; } else if (num == …

3
Rcppを遅くしてR目的関数を最適化すると、なぜですか?
私は現在、反復ごとに多項ロジットモデルの最適化の複数のステップを必要とするベイズ法に取り組んでいます。これらの最適化を実行するためにoptim()を使用し、Rで記述された目的関数を使用しています。プロファイリングにより、optim()が主なボトルネックであることが明らかになりました。 調べてみると、目的関数を再コーディングするとプロセスが高速化する可能性があることを示唆するこの質問が見つかりましたRcpp。私は提案に従い、目的関数をRcppでに遅くなりました(約2倍遅い!)。 これは初めてRcpp(またはC ++に関連するもの)で、コードをベクトル化する方法を見つけることができませんでした。それをより速くする方法はありますか? Tl; dr:Rcppの関数の現在の実装は、ベクトル化されたRほど高速ではありません。速くする方法は? 再現可能な例: 1)Rおよびで目的関数を定義するRcpp:切片のみの多項モデルの対数尤度 library(Rcpp) library(microbenchmark) llmnl_int <- function(beta, Obs, n_cat) { n_Obs <- length(Obs) Xint <- matrix(c(0, beta), byrow = T, ncol = n_cat, nrow = n_Obs) ind <- cbind(c(1:n_Obs), Obs) Xby <- Xint[ind] Xint <- exp(Xint) iota <- c(rep(1, (n_cat))) denom <- log(Xint %*% …
16 c++  r  optimization  rcpp 

3
200000以上の要素を含む2つの配列要素の最小積を見つける最速の方法
アレイがありa[n]ます。番号nは当社が入力します。私は、最小限の製品を見つける必要があるa[i]とa[j]場合を: 1) abs(i - j) > k 2)a[i] * a[j]最小化されている これが私の解決策です(非常に素朴です): #include <iostream> using namespace std; #define ll long long int main() { ll n,k; cin >> n >> k; ll a[n]; for(ll i=0;i<n;i++) cin >> a[i]; ll mn; bool first = true; for(ll i=0;i<n;i++) { for(ll j=0;j<n;j++) { if(i!=j) …

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は同じことを行うことができますか? …

4
コンパイラのビルトインを使用せずにオーバーフローセーフな追加を効率的に計算するCスニペットはありますか?
intオーバーフローが発生すると失敗する、別のに追加するC関数を次に示します。 int safe_add(int *value, int delta) { if (*value >= 0) { if (delta > INT_MAX - *value) { return -1; } } else { if (delta < INT_MIN - *value) { return -1; } } *value += delta; return 0; } 残念ながら、GCCやClangでは十分に最適化されていません。 safe_add(int*, int): movl (%rdi), %eax testl %eax, …

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 | …

3
最適化をオフにできるので、クロージャーからのスコープ内変数は「最適化されません」。
最近のブラウザーで行われたコード最適化の副産物として、デバッグ中に、「実際に」スコープ内にあるすべての変数を「見る」ことはできません。これはよく知られており、SOに関する前の質問で対処されています。この機能は、確かに本番環境では便利ですが、開発中に私を悩ませますが、遅くなります(それは明らかです)。 今私の質問は、この動作をオフにする方法はありますか?構成ファイルを編集できますか、それともブラウザプラグインがありますか、それともブラウザ実行可能ファイルの「開発者向けの特別なビルドバージョン」がありますか?新しいコードを書いているとき、すぐにコードをコンソールに入力するのが好きなので、これは本当に私を悩ませています。 更新/編集 これは、部分的な解決策です。Paul1365972の功績です。 次のような特別なオプションを使用して、コマンドラインからChromeブラウザを起動する必要があります。 Chromeを完全に閉じます コンソールからChromeを実行します"C:/Program Files (x86)/Google/Chrome/Application/chrome.exe" --js-flags="--allow-natives-syntax" 。これは、他のWindows OSと同様です。 開発者コンソールを開いて実行し"%GetHeapUsage()"ます。オプションを使用してChromeを適切に起動した場合、番号がコンソールに記録されます。それ以外の場合は、構文エラーが発生します。 このコマンドラインフラグを使用すると%、で始まるコマンドを使用して「V8エンジンと通信」できます。これは、プレーンJavaScriptの構文エラーです。この種の使用可能なV8コマンドのリストは、Paulの回答に記載されています。 あり%NeverOptimizeFunction()、私はちょうど呼び出すことと、それを使って行うことがあるだろうことのように見えたものですそのリスト、上。残念ながら、次のスクリーンショットに示すように、その関数は私が望んでいたことをしません。 (((Paulの回答からのもう1つのリンク(v8ネイティブノードモジュール)は、このコンテキストではここでは重要ではありません。コードがクラッシュしないように、「%」関数呼び出しを1行で囲むだけです。 v8ではないブラウザー))) (((これが機能したとき(この最適化がまだ発明/実装されていないとき)を覚えています。10年前、15年前、そのようなものです。Chromeの最新バージョンは何ですか(もしそして、あなたができる最後のFirefoxバージョンは何でしたか(もっと確かにここにあります)?それはあなたに賞金をもたらすことはありませんが、もしあなたがたまたま知っていてそれを回答として投稿した場合、あなたは賛成票を得るでしょう。 。))) ソリューション PETR SRNICEKに感謝 新しい質問 ペトルのソリューションは多くのことを助けますが、完璧ではありません。この質問は長くなりすぎているので、Petrのソリューションをどのように改善できるかについて新しい質問を投稿しました。(もちろん、ここでこの質問を編集することもできますが、私が何を意味するのかを知っていれば、それは「歴史的でない」と感じるでしょう。)

5
メモリオーバーフローを引き起こしたメモリに一時的な行列を作成せずに行列を「コピー」する方法は?
はるかに大きい割り当てられたメモリにマトリックスを割り当てることにより、MATLABはそれを 'コピー'しながら何らかの方法で複製し、コピーされるマトリックスが十分に大きい場合、メモリオーバーフローが発生します。これはサンプルコードです: main_mat=zeros(500,500,2000); n=500; slice_matrix=zeros(500,500,n); for k=1:4 parfor i=1:n slice_matrix(:,:,i)=gather(gpuArray(rand(500,500))); end main_mat(:,:,1+(k-1)*n:1+(k-1)*n+n-1)=slice_matrix; %This is where the memory will likely overflow end ただ「スマッシュ」にどのような方法slice_matrixにmain_matオーバーヘッドなし?前もって感謝します。 編集: main_matあらかじめ割り付けておくとオーバーフローが発生します。main_matがmain_mat=zeros(500,500,1);(小さいサイズ)で初期化された場合、オーバーフローは発生しませんが、行列が割り当てられる前に割り当てが行われないため、オーバーフローが遅くなります。これにより、範囲がk増えるにつれてパフォーマンスが大幅に低下します。

4
Cコンパイラがスイッチを最適化する理由と異なる場合
最近、奇妙な問題に遭遇したとき、私は個人的なプロジェクトに取り組んでいました。 非常にタイトなループでは、0〜15の値の整数があります。値0、1、8、9の場合は-1を取得し、値4、5、12、13の場合は1を取得する必要があります。 私はいくつかのオプションを確認するためにgodboltを使用しましたが、コンパイラーがifチェーンと同じ方法でswitchステートメントを最適化できないようであることに驚きました。 リンクはここにあります:https://godbolt.org/z/WYVBFl コードは次のとおりです。 const int lookup[16] = {-1, -1, 0, 0, 1, 1, 0, 0, -1, -1, 0, 0, 1, 1, 0, 0}; int a(int num) { return lookup[num & 0xF]; } int b(int num) { num &= 0xF; if (num == 0 || num == 1 || …

3
list :: empty()マルチスレッドの動作?
さまざまなスレッドが要素を取得するためのリストがあります。リストが空のときに保護しているmutexをロックしないようにするために、ロックするempty()前にチェックします。 呼び出しがlist::empty()100%正しくない場合でも問題ありません。同時list::push()およびlist::pop()コールのクラッシュまたは中断を回避したいだけです。 私はVC ++とGnu GCCが時々empty()間違って、何も悪いことはないと思い込んでも大丈夫ですか? if(list.empty() == false){ // unprotected by mutex, okay if incorrect sometimes mutex.lock(); if(list.empty() == false){ // check again while locked to be certain element = list.back(); list.pop_back(); } mutex.unlock(); }

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] * …

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