Artık javascript'te mikrosaniyeleri ölçmenin yeni bir yöntemi var:
http://gent.ilcore.com/2012/06/better-timer-for-javascript.html
Ancak geçmişte, JavaScript'te bir milisaniye zamanlayıcıdan 0.1 milisaniye hassasiyet elde etmenin kaba bir yöntemini buldum. İmkansız mı? Hayır! Okumaya devam et:
Kendinden kontrol edilen zamanlayıcı doğruluklarını gerektiren bazı yüksek hassasiyetli deneyler yapıyorum ve belirli sistemlerde belirli tarayıcılarda 0,1 milisaniye hassasiyetini güvenilir bir şekilde elde edebildiğimi keşfettim.
Hızlı sistemlerdeki modern GPU hızlandırmalı web tarayıcılarında (örneğin, birkaç çekirdeğin boşta olduğu i7 dört çekirdekli, yalnızca tarayıcı penceresi) - artık zamanlayıcıların milisaniye hassasiyetinde olduğuna güvenebilirim. Aslında, boşta olan bir i7 sisteminde o kadar doğru hale geldi ki, aynı milisaniyeyi 1000'den fazla denemede güvenilir bir şekilde elde edebildim. Yalnızca fazladan bir web sayfası veya başka bir şey yüklemek gibi şeyler yapmaya çalıştığımda, milisaniye doğruluğu azalır (Ve önce-sonra zaman kontrolü yaparak kendi düşük doğruluğumu başarılı bir şekilde yakalayabilirim. işlem sürem aniden 1 veya daha fazla milisaniyeye uzadı - bu, muhtemelen CPU dalgalanmalarından çok olumsuz etkilenen sonuçları geçersiz kılmama yardımcı oluyor).
İ7 dört çekirdekli sistemlerde (tarayıcı penceresi tek pencere olduğunda) bazı GPU hızlandırmalı tarayıcılarda o kadar doğru hale geldi ki, JavaScript'te 0.1 ms hassas zamanlayıcıya erişebilmeyi dilediğimi fark ettim, çünkü doğruluk nihayet şimdi geldi yüksek hassasiyet gerektiren ve uygulamaların doğruluk sapmaları için kendi kendini doğrulayabildiği belirli türdeki niş uygulamalar için bu tür zamanlayıcı hassasiyetini değerli kılmak için bazı ileri teknoloji tarama sistemlerinde var.
Açıktır ki, birkaç geçiş yapıyorsanız, birden çok geçiş (örneğin 10 geçiş) çalıştırabilir ve ardından 0,1 milisaniye hassasiyet elde etmek için 10'a bölebilirsiniz. Bu, daha iyi hassasiyet elde etmenin yaygın bir yöntemidir - birden çok geçiş yapın ve toplam süreyi geçiş sayısına bölün.
ANCAK ... Alışılmadık derecede benzersiz bir durum nedeniyle belirli bir testin yalnızca tek bir kıyaslama geçişini yapabilirsem, bunu yaparak 0,1 (ve bazen 0,01 ms) hassasiyet elde edebileceğimi anladım:
Başlatma / Kalibrasyon:
- Zamanlayıcı bir sonraki milisaniye artana kadar beklemek için meşgul bir döngü çalıştırın (zamanlayıcıyı bir sonraki milisaniye aralığının başlangıcına hizalayın) Bu meşgul döngü bir milisaniyeden az sürer.
- Zamanlayıcının artmasını beklerken bir sayacı artırmak için başka bir meşgul döngü çalıştırın. Sayaç, bir milisaniyede kaç tane sayaç artışı olduğunu söyler. Bu yoğun döngü bir tam milisaniye sürer.
- Sayılar son derece kararlı hale gelene kadar (yükleme süresi, JIT derleyicisi, vb.) Yukarıdakileri tekrarlayın. 4. NOT: Sayının kararlılığı, boşta çalışan bir sistemde elde edilebilir hassasiyetinizi verir. Hassasiyeti kendi kendinize kontrol etmeniz gerekirse, varyansı hesaplayabilirsiniz. Farklar bazı tarayıcılarda daha büyük, diğer tarayıcılarda daha küçüktür. Daha hızlı sistemlerde daha büyük ve daha yavaş sistemlerde daha yavaş. Tutarlılık da değişir. Hangi tarayıcıların diğerlerinden daha tutarlı / doğru olduğunu anlayabilirsiniz. Daha yavaş sistemler ve meşgul sistemler, başlatma geçişleri arasında daha büyük farklılıklara yol açacaktır. Tarayıcı size 0,1 ms veya 0,01 ms ölçümlere izin verecek kadar hassaslık sağlamıyorsa, bu size bir uyarı mesajı görüntüleme fırsatı verebilir. Zamanlayıcı çarpıklığı bir sorun olabilir, ancak bazı sistemlerdeki bazı tamsayı milisaniye zamanlayıcıları oldukça doğru bir şekilde artar (tam nokta üzerinde), bu da güvenebileceğiniz çok tutarlı kalibrasyon değerleriyle sonuçlanır.
- Son sayaç değerini (veya son birkaç kalibrasyon geçişinin ortalamasını) kaydedin
Bir geçişten milisaniyenin altındaki hassasiyete kıyaslama:
- Zamanlayıcı bir sonraki milisaniye artana kadar beklemek için meşgul bir döngü çalıştırın (zamanlayıcıyı bir sonraki milisaniye aralığının başlangıcına hizalayın). Bu yoğun döngü bir milisaniyeden az sürer.
- Zamanı tam olarak karşılaştırmak istediğiniz görevi gerçekleştirin.
- Zamanlayıcıyı kontrol edin. Bu size tamsayı milisaniye verir.
- Zamanlayıcının artmasını beklerken bir sayacı artırmak için son bir meşgul döngüsü çalıştırın. Bu yoğun döngü bir milisaniyeden az sürer.
- Bu sayaç değerini, başlatmadan itibaren orijinal sayaç değerine bölün.
- Şimdi milisaniyenin ondalık kısmını aldınız !!!!!!!!
UYARI: Meşgul döngüler web tarayıcılarında ÖNERİLMEZ, ancak neyse ki, bu yoğun döngüler her biri 1 milisaniyeden daha az çalışır ve yalnızca birkaç kez çalıştırılır.
JIT derlemesi ve CPU dalgalanmaları gibi değişkenler büyük yanlışlıklar ekler, ancak birkaç başlatma geçişi çalıştırırsanız, tam dinamik yeniden derlemeye sahip olursunuz ve sonunda sayaç çok doğru bir şeye yerleşir. Meşgul döngülerdeki farklılıkların farklılıklara yol açmaması için tüm meşgul döngülerin tüm durumlar için tam olarak aynı işlev olduğundan emin olun. Sonuçlara güvenmeye başlamadan önce, JIT derleyicilerinin tam dinamik yeniden derlemeye (dynarec) stabilize olmasını sağlamak için tüm kod satırlarının birkaç kez çalıştırıldığından emin olun.
Aslında, bazı sistemlerde hassasiyetin mikrosaniyelere yaklaştığına şahit oldum , ancak buna henüz güvenmezdim. Ancak 0.1 milisaniye hassasiyetinin, benim tek tarayıcı sayfası olduğum boşta duran dört çekirdekli bir sistemde oldukça güvenilir bir şekilde çalıştığı görülüyor. Yalnızca tek seferlik geçişler yapabildiğim (ortaya çıkan benzersiz değişkenler nedeniyle) ve birden fazla tekrar geçişinin ortalamasını almak yerine her geçişi tam olarak zamanlamam gerektiği bilimsel bir test vakasına geldim, bu yüzden bunu yaptım.
0,1 ms hassasiyetin güvenilirliğini doğrulamak için (birkaç saniye sağlam kaldım) birkaç ön geçiş ve sahte geçiş yaptım (ayrıca dynarec'i çözmek için), ardından kıyaslama yapılırken ellerimi klavyeden / fareden uzak tuttum, sonra birkaç tane yaptım 0,1 ms hassasiyetin güvenilirliğini doğrulamak için son geçişler (tekrar sabit kaldı). Bu aynı zamanda güç durumu değişiklikleri veya diğer şeyler gibi şeylerin öncesi ve sonrası arasında meydana gelmediğini ve sonuçlara müdahale ettiğini doğrular. Her bir karşılaştırma testi geçişi arasında ön testi ve son testi tekrarlayın. Bunun üzerine aradaki sonuçların doğru olduğundan neredeyse emindim. Elbette bir garanti yoktur, ancak bir web tarayıcısında bazı durumlarda hassas <0,1 ms hassasiyetin mümkün olduğunu gösterir .
Bu yöntem yalnızca çok, çok niş durumlarda kullanışlıdır . Öyle olsa bile, kelimenin tam anlamıyla% 100 sonsuz garanti edilemez, oldukça güvenilir bir doğruluk ve hatta birkaç kat dahili ve harici doğrulama ile birleştirildiğinde bilimsel doğruluk elde edebilirsiniz.