R zamanlama fonksiyonları [kapalı]


36
  1. Bir fonksiyonun çalışmasını tekrarlamak için gereken süreyi ölçmek istiyorum. replicate()For-döngüler eşdeğer mi ve kullanıyor mu? Örneğin:

    system.time(replicate(1000, f()));
    system.time(for(i in 1:1000){f()});
    

    Tercih edilen yöntem hangisidir.

  2. Çıktısında system.time()olduğu sys+userprogramı çalıştırmak için gerçek CPU zamanı? elapsedProgramın zaman performansının iyi bir ölçüsü mü ?


3
Sadece kayıt için, bu sorunun gidişatını değiştirmek için çok geç kaldığım için: Bu, StackOverflow için en uygun olduğunu düşündüğüm türden bir konu.
Matt Parker

2
@Matt Bir programın bir defa SO için uygun olduğu hakkındaki soruları kabul ediyorum. Ayrıca, bu sorunun tam anlamıyla yorumlanmasının (cevapların birkaçında olduğu gibi) CV'yi burada konu dışı bırakacağı konusunda hemfikirim. Bir zamanlama deneyi tasarlamada ve böyle bir deneyin sonuçlarını analiz etmede bazı istatistiksel ilgi var gibi görünmektedir .
whuber

Yanıtlar:


19

Programların etkili zamanlaması için, özellikle alternatif çözümleri karşılaştırmakla ilgileniyorsanız, bir kontrole ihtiyacınız var! İyi bir yol, zamanladığınız prosedürü bir işleve koymaktır. Bir zamanlama döngüsü içindeki fonksiyonu çağırınız. Temelde, fonksiyonunuzdaki tüm kodu çıkararak ve ondan geri dönerek bir saplama prosedürü yazın (ancak tüm argümanları içeride bırakın). Saplama zamanlaması ve tekrar zamanlama içine yerleştirin. Bu, zamanlamayla ilişkili tüm ek yükü ölçer. Net elde etmek için saplama zamanını işlem süresinden çıkarın: bu, gereken gerçek zamanın doğru bir ölçüsü olmalıdır.

Günümüzde çoğu sistem kalıcı olarak kesintiye uğrayabildiğinden, değişkenliği kontrol etmek için birkaç zamanlama çalışması yapmak önemlidir. Yerine biri uzun vadede yapmanın saniye do yaklaşık silsileleri saniye her. Tek seferde bunu bir çift döngüde yapmanıza yardımcı olur. Kullanımı sadece bu kadar kolay olmakla kalmaz, her zaman serisinde tahminleri iyileştiren bir miktar negatif korelasyon ortaya çıkarır.NmN/m

Bu deneysel tasarımın bu temel prensiplerini kullanarak, kodu nasıl kullandığınıza bağlı olarak herhangi bir farkı kontrol edersiniz (örneğin, bir for loop ile replicate () arasındaki fark). Bu senin problemini ortadan kaldırıyor.


25

İki puanınızla ilgili olarak:

  1. Bu stilistik. replicate()İşlevsel olması hoşuma gidiyor .
  2. Odaklanma eğilimindeyim elapsed, yani üçüncü sayı.

Sık sık yaptığım şey

N <- someNumber
mean(replicate( N, system.time( f(...) )[3], trimmed=0.05) )

N tekrar aramaların% 90'ının kesilmiş ortalamasını almak için f().

(Bir düşünceyi yakaladığı için Hadley'e teşekkürler.)


2
Şunu yapmayın mean(replicate(N, system.time(f(...))[3]), trim = 0.05)?
hadley

2
F () araması uzunsa, sorun olmaz. Bununla birlikte, eğer f () çağrısı kısa ise, zaman aşımına uğrayan herhangi bir zaman aşımı büyük olasılıkla hata ölçümünü arttırır. F () 'nın birçok tekrarı için tek bir system.time () çağrısı ile, bir küçük sonsuz değere kadar (ve daha hızlı geri dönene kadar) hatayı bölmek gerekir.
John

@John: Teşekkürler ama ne dediğini tam olarak anlamadım. Hala hangisinin daha iyi olduğunu merak ediyorum, system.time () içinde f () tekrarlıyorum?
Tim

System.time () komutuna yapılan her çağrı, bir miktar ölçüm hatasına neden olan, çağrılması gereken değişken bir süreye sahiptir. Bu küçük bir miktar. Ama eğer f () çok kısa bir çağrıysa? Daha sonra bu hata f () çağrısı için harcanan zamanla çözülebilir. Yani, tek bir system.time () içinde f () 'yi 1e5 kez aradığınızda hata, 1e5 parçalarına bölünür. System.time () işlevini her f () için çağırdığınızda, eğer f () süresi küçükse etki anlamlı olabilir. Elbette, ihtiyacınız olan tek şey göreceli zamanlama ise, çok da önemli değil.
John

Oh, ve ikinci kısım, bir kez sadece system.call () 'i çağırmanın daha hızlı olacağıdır.
John

10

Ayrıca tarafından döndürülen timesteps ile zaman da yapabilirsiniz Sys.time; bu tabii ki duvar zamanını ölçer, yani gerçek zamanlı hesaplama zamanı. Örnek kod:

Sys.time()->start;
replicate(N,doMeasuredComputation());
print(Sys.time()-start);

3

Hangi zamanlama metriğini kullanacağımla ilgili olarak, diğer cevaplayıcılara ekleyemiyorum.

Kullanılacak fonksiyon ile ilgili olarak rbenchmark paketindeki ? Benchmark'ı kullanmayı seviyorum .


1

Farklı şeyler yapıyorlar. İstediğin zaman. replicate (), işlevin her uygulamasının sonuçlarının bir vektörünü döndürür. For döngüsü değil. Bu nedenle, bunlar eşdeğer ifadeler değildir.

Buna ek olarak, zaman bir şey yapılmasını istediğiniz çeşitli şekillerde. Sonra en verimli yöntemi bulabilirsiniz.


mod-tip: İkinci kısmı Dirk'ün cevabına yorum olarak gönderin.
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.