SORU
15 Temmuz 2009, ÇARŞAMBA


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
15 Temmuz 2009, ÇARŞAMBA


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ğerler memset 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.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • andony5589

    andony5589

    7 Aralık 2011
  • BSA

    BSA

    9 NİSAN 2012
  • disneychannel

    disneychanne

    19 ŞUBAT 2006