2013-01-31 22 views
8

MEX'i kullanarak derledikten sonra MATLAB olarak adlandırdığım C kodunu yazdım. Cı-kod içinde, aşağıdaki kodu kullanarak bir hesaplama parçası süresinin ölçülmesi:MATLAB'ın tic-toc & C'nin saat tutarsızlığı

clock_t begin, end; 
double time_elapsed; 
begin = clock(); 
/* do stuff... */ 
end = clock(); 
time_elapsed = (double) ((double) (end - begin)/(double) CLOCKS_PER_SEC); 

Geçen zaman saniye cinsinden uygulama süresi olmalıdır.

Daha sonra time_elapsed değerini MATLAB olarak çıkarıyorum (düzgün şekilde dışa aktarılır; kontrol ettim). Daha sonra MATLAB tarafı bu C işlevini (MEX'i kullanarak derledikten sonra) ve ben tic ve toc kullanarak yürütme süresini ölçüyorum. Tam bir saçmalık olduğu ortaya çıkınca, tc ve toc kullanarak hesapladığım zamanın 0.0011s (ortalama 500 çalışma, st. Dev 1.4e-4) iken, C kodu tarafından döndürülen süre 0.037'dir. ortalama 500 çalışma, st. dev. 0.0016).

  1. bütün fonksiyon için yürütme zamanı kodunun bir kısmı için yürütme zamanından daha düşüktür:

    İşte bir iki çok garip gerçekleri fark edebilirsiniz. Bu nedenle, MATLAB veya C ölçümleri kesinlikle yanlıştır.
  2. C kodunda ölçülen yürütme süreleri çok dağınık ve çok yüksek st. sapma (tik-toc için sadece% 13'e kıyasla varyasyon katsayısı% 44).

Bu zamanlayıcılarla neler oluyor?

+0

Saatin çözünürlüğü nedir? 'Begin = clock()' ın, bir saat tiksinin gerçekleşmesinden hemen mı yoksa hemen mı sonra yürütüldüğünü nasıl bilebiliriz? Bu sonucu etkiler mi? Muhtemelen. –

+0

@BoPersson Yani, 'clock() 'en çok bir kenarı kaçırabilir? –

+4

Yani bir kene, sonucu etkileyecek kadar büyük olabilir. 18 ms. –

cevap

6

Elmaları portakallarla karşılaştırıyorsunuz. Matlab'ın belgelerine de

Görünüş:

tik-http://www.mathworks.com/help/matlab/ref/tic.html
toc - http://www.mathworks.com/help/matlab/ref/toc.html

tik ve toc gerçek geçen süreyi ölçmek edelim.

Şimdi saat işlev http://linux.die.net/man/3/clock işlevine bakın. Özellikle

,

saat() işlev program tarafından kullanılan işlemci zaman bir yaklaşım döndürür.

İade edilen değer, saatine kadar kullanılan CPU zamanıdır; için kullanılan saniye sayısını alın, CLOCKS_PER_SEC ile bölün. Kullanılan işlemci zamanı mevcut değilse veya değeri olarak gösterilemiyorsa, işlev (saat_t) -1 değerini döndürür.

Yani farkı ne açıklama getirebilir: ve (tik ve toc ile ölçülen) gerçek geçen süre (saat() ile ölçülen)

  • CPU zamanı aynı DEĞİLDİR. Yani cpu süresinin geçen süreden daha az olmasını bekler miydiniz? Pekala belki.Ya 0,0011 içinde 10 çekirdeği% 100 kullanıyorsunuz? Bu, clock() ölçümünün tik ve toc ile ölçülen 10x olduğu anlamına gelir. Muhtemel, olası değil.
  • saat (.) Belgeleri doğru olmayan ve belgelerle tutarlı, bu yaklaşık işlemci zaman ölçümüdür! Programlayıcı kuantum büyüklüğüne ayarlandığını sanıyorum, ama kontrol etmek için Linux çekirdek kodunu kazmadım. Diğer işletim sistemlerini de kontrol etmedim, ancak this dude's blog bu teori ile tutarlıdır.

Yeni başlayanlar için ne yapmalı, elmaları elmaları karşılaştır! Ardından, zamanlayıcı çözünürlüğünü dikkate aldığınızdan emin olun.