küçük tamsayı dizisi takas: döngü için memset vs
Şamandıra dizi/: bir tam sayı sıfır iki yolu vardır
memset(array, 0, sizeof(int)*arraysize);
ya da:
for (int i=0; i <arraysize; i)
array[i]=0;
belli ki, memset daha hızlı büyük arraysize
. Ancak, hangi noktada memset yükü aslında döngü yükü daha büyük? Örneğin, boyutu bir dizi için en iyisi olur 5 - hangisi? İlk, 2., belki de un-rulo sürümü bile:
array[0] = 0;
array[1] = 0;
array[2] = 0;
array[3] = 0;
array[4] = 0;
CEVAP
Tüm olasılık, memset() derleyici tarafından inlined (çoğu derleyici tedavi olarak bir 'iç', temelde anlamına gelir. inlined dışında belki de en iyi duruma getirmeleri ya sürece açıkça devre dışı).
Örneğin, burada release notes from GCC 4.3 bazı:
Blok kod oluşturma hareket (
memcpy
) ve blok set (memset
) oldu yeniden. GCC şimdi alabilirsiniz en iyi algoritma (, içe kıvrık döngü döngü, rep öneki ile talimat ya da çağrı kitaplığı) boyutuna göre blok kopyalanan ve CPU olmak için optimize edilmiş. Yeni bir seçenek-minline-stringops-dynamically
vardır eklendi. Bu seçenek ile dize bilinmeyen boyutta işlemler küçük bloklar gibi genişletilmiş için de olsa-line kopyalanan kodu, büyük blok kütüphane çağrısı kullanılır. Bu daha hızlı bir kod verir-minline-all-stringops
kütüphane uygulama kapasitesine sahiptir önbellek hiyerarşisi ipuçlarını kullanarak. Bu sezgisel özel seçimi algoritma ile üzerine yazılabilir-mstringop-strategy
. Yeni de 0 dan farklı değerlermemset
inlined.
Derleyici bir şey verdin alternatif örnekler ile benzer yapmak mümkün olabilir, ama daha az olasıdır bahis ediyorum.
Ve niyet önyükleme (döngü özellikle zor grok için değil) için grep
-mümkün değil ve bir bakışta daha fazla hemen belli.
String.Ondalık basamak olmadan binlerc...
Bir kodlama kullanmadan bayt dizisi iç...
Nasıl dava Vim / küçük harf duyarlı ar...
Bir tamsayı'in kare kökü belirlem...
Nasıl Onaltılık Dize ve Başkan versa i...