サイズが1000から10000(1k .. 10k)の配列があります。各要素はint64です。私の仕事は、配列の2つの最小要素、最小要素と残りの要素から最小要素を見つけることです。
IntelCore2またはCorei7用のC++で可能な限り最速のシングルスレッドコードを取得したい(CPUモードは64ビット)。
この関数(配列から2つを最小にする)はホットスポットであり、反復回数が非常に多い2つまたは3つのforループにネストされています。
現在のコードは次のようなものです。
int f()
{
int best; // index of the minimum element
int64 min_cost = 1LL << 61;
int64 second_min_cost = 1LL << 62;
for (int i = 1; i < width; i++) {
int64 cost = get_ith_element_from_array(i); // it is inlined
if (cost < min_cost) {
best = i;
second_min_cost = min_cost;
min_cost = cost;
} else if (cost < second_min_cost) {
second_min_cost = cost;
}
}
save_min_and_next(min_cost, best, second_min_cost);
}