タスクは、C 整数配列の各要素をその絶対値に設定することです。できるだけ効率的に行うようにしています。以下は、私が行った最適化の進行です。これらが実際に最適化なのかどうか、さらにできることがあれば教えてください!
関数の最初のパラメーターは整数配列になり、2 番目はその配列の整数サイズになります。
標準的な実装は次のとおりです。
void absolute (int array[], int n){
for(int i = 0; i < n; i++)
if(array[i] < 0)
array[i] = - array[i];
}
入門プログラミング コースの教授を満足させるにはこれで十分ですが、もう少し試して、途中で最適化について何か学びたいと思います。
https://stackoverflow.com/a/2074403に基づく、ブランチレスの絶対値:
void absolute (int array[], int n){
for(int i = 0; i < n; i++){
uint32_t temp = array[i] >> 31; // make a mask of the sign bit
array[i] ^= temp; // toggle the bits if value is negative
array[i] += temp & 1; // add one if value was negative
}
}
ゼロとの比較がより効率的であり、余分な変数を配置する必要がないことに基づいています。
void absolute (int array[], int n){
for(n--; n >= 0;){
uint32_t temp = array[n] >> 31;
array[n] ^= temp;
array[n] += temp & 1;
}
}
(これはもうベクトル化されますか?)
それは私が得た限りです。この機能を最適化するためにさらにできることはありますか?