Nasıl döngü için bir yürütme zamanı ölçebilirsiniz?

11 Cevap java

I for loops php, c, piton gibi çeşitli platformlarda yürütme zamanı ölçmek istiyorum, Java, javascript ... Bunu nasıl ölçebilirsiniz?

Ben bu platformları biliyorum bu yüzden ben bu bahsediyorum:

 for (i = 0; i < 1000000; i++)
 {

 }

Ben döngü içinde bir şey ölçmek istemiyorum.

Biraz değişiklik:

@all Some of the friends of mine are saying compiler will optimize this code making this loop a useless loop. I agree with this. we can add a small statement like some incremental statement, but the fact is I just want to calculate the execution time of per iteration in a loop in various languages. By adding a incremental statement will add up the execution time and that will effect the results, cause on various platforms, execution time for incrementing a value also differ and that will make a result useless. In short, in better way I should ask:

I WANT TO CALCULATE THE EXECUTION TIME OF PER ITERATION IN A LOOP on Various PLATFORMS..HOW CAN DO THIS???

--- düzenlemek

I came to know about Python Profilers Profiler modules ...which evaluate cpu time... absolute time.. Any suggestions???Meanwhile i am working on this...

11 Cevap

Eğer program nedeniyle bu sistem zamanlayıcı preempted olmanın bekler zaman umurumda mı: o da ulaşmak istediğiniz tam olarak ne bağlı olduğunu unutmayın? Yukarıdaki tüm çözümleri dikkate geçen gerçek zaman alabilir, ancak diğer işlemler yerine kendi çalıştırdığınızda o da zaman gerektirir.

Bu umurumda değil eğer, yukarıdaki çözümleri tüm iyi. Eğer bakım yaparsanız, muhtemelen aslında döngü ne kadar sürdüğünü görmek için bazı profilleme yazılım gerekir.

Ben senin döngü şey yapmaz ama bir program ile başlar ve (bir linux ortamında en azından) vereceğimi time you-prg-executable.

time gibi çalışacak araçlar varsa o zaman ben araştırmak istiyorum. Emin değilim, ama ben java için JRat bakmak, ve C ve C + + GCC en gcov ediyorum. Hiç şüphe yok ki, diğer diller için benzer araçlar vardır. Ama, tabii, onlar gerçek zaman ya da vermek olmadığını görmek gerekir.

Bir cevap C + + için verilmiş olmasına rağmen bunu boş bir yineleme yapmak için bir program alır zamanı ölçmek için çalışıyoruz gibi, ("[Sen] döngü içinde bir şey ölçmek istemiyorum") açıklamasından görünüyor döngü.

Burada dikkat ediniz: sadece farklı platformlarda ve işlemciler arasında değişen süreleri alacak, ancak birçok derleyiciler etkili herhangi bir döngü büyüklüğü için "0" olarak cevap veren, böyle döngüleri uzak optimize eder.

javascript

start = new Date;
for(var i = 0; i < 1000000; i++) {}
time = new Date - start;

Python bunu yapmak için doğru yolu komut satırından timeIt çalıştırmak için:

$ python -m timeit "for i in xrange(100): pass"
100000 loops, best of 3: 2.5 usec per loop

Herhangi bir ekstra şeyler gerektirmez PHP diğer sürüm:

$start = microtime(true);

for (...) {
   ....
}

$end = microtime(true);

echo ($end - $start).' seconds';

C ve C + + gibi derlenen dillerde, derleyici bayrakları döngü uzak optimize değildir böyle ayarlanmış olduğundan emin olun. Optimizasyon açıkken ben en çok derleyiciler hiçbir döngü içinde oluyor algılamak ve onu optimize beklenebilir.

Eğer Python kullanarak ediyorsanız, özellikle şeyleri zamanlama için yapılmış bir modülünü kullanabilirsiniz. Bu timeIt denir.

Burada bulunan referansların bir çift (sadece google'da) şunlardır:

  1. Dive Into Python: Using the Timeit Module
  2. Python Documentation: Timeit Module

Ve burada hızlı bir şekilde başlamak için bazı örnek kod:

import timeit
t = timeit.Timer("for i in range(100): pass", "")
# Timeit will run the statement 1,000,000 times by default, and return the time it took for all the runs together (it doesn't try to average them out or anything).
t.timeit()
2.9035916423318398 # This is the result. Don't forget (like I did in an earlier edit) that this is the result of running the code 1,000,000 times!

php: (code timer)

$timer = new timer();

$timer->start();

 for(i=0;i<1000000;i++)
    {

    }

$timer->stop();

echo $timer->getTime();

Sonuç alışkanlık boş bir döngü içinde mantıklı, sinüs en derleyiciler zamanında önce, zamanı derleme de optimize eder.

To compare languages speed, you will need a real algorithm, like "Merge Sort", "Binary Search" or maybe "Dijkstra" if you want something complicated. Implement the same algorithm in all languages then compare.

Burada bir Bio-Enformatik algoritması bir ölçüttür. link text Sonuçları sayfasını kontrol edin

Noktasına: sadece şimdiki zaman before şey yapıyor (bu start time) almak ve (bu {[olan şimdiki zaman after şey yapıyor olsun (3)]}) ve sonra sadece geçen süreyi almak için ilkokul matematik yapmak. Her API geçerli saati almak için yollar sağlar. Java örneğin o-System.currentTimeMillis() ve System.nanoTime() bulunuyor.

But: Özellikle Java, geçen zaman her zaman güvenilir değildir. Orada microdifferences olması ve aynı zamanda how Eğer testler yapmak çok bağlı olabilir. Eğer test2 yürütülmesine () ve ardından test1 () yeniden düzenlemek zaman slower biraz sonra ve o hale yürütülür çünkü test2 () test1 daha hızlıdır durumlar () gördüm.

Son ama en az değil, mikro-optimizasyon tüm kötülüklerin köküdür.

Java, hem Apache Commons Lang ve için Spring Framework var StopWatch, bir olarak kullanabileceğiniz sınıfları (Apache here için Java doc bakınız) yürütme süresini ölçmek için bir yoldur. Yorganın altında sadece System.currentTimeMillis() çıkarılarak ve, gerçi çok kod, bu programı kullanmak için seni kurtarmak değil.