日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > linux >内容正文

linux

linux 延时一微秒_让我们暂停一微秒

發(fā)布時(shí)間:2023/12/3 linux 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 linux 延时一微秒_让我们暂停一微秒 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

linux 延時(shí)一微秒

低延遲Java應(yīng)用程序中的許多基準(zhǔn)測試涉及必須在一定負(fù)載下測量系統(tǒng)。 這就要求保持事件進(jìn)入系統(tǒng)的穩(wěn)定吞吐量,而不是在沒有任何控制的情況下以全油門將事件泵入系統(tǒng)。

我經(jīng)常要做的任務(wù)之一是在事件之間將生產(chǎn)者線程暫停一小段時(shí)間。 通常,此時(shí)間量為個(gè)位數(shù)微秒。

那么,如何在此時(shí)間內(nèi)暫停線程? 大多數(shù)Java開發(fā)人員會立即想到Thread.sleep() 。 但這是行不通的,因?yàn)門hread.sleep()僅下降到毫秒,并且比我們暫停所需的時(shí)間(以微秒為單位)長一個(gè)數(shù)量級。

我在StackOverflow上看到一個(gè)答案,將用戶指向TimeUnit.MICROSECONDS.sleep()以便睡眠少于一毫秒。 引用JavaDoc ,這顯然是不正確的:

使用此時(shí)間單位執(zhí)行Thread.sleep 。 這是一種方便的方法,可以將時(shí)間參數(shù)轉(zhuǎn)換為Thread.sleep方法所需的形式。

因此,您將無法獲得比Thread.sleep(1)相似的1毫秒的暫停。 (您可以在下面的代碼中嘗試示例來證明這一點(diǎn))。

這樣做的原因是這種暫停方法(即使線程進(jìn)入睡眠狀態(tài)并喚醒它)永遠(yuǎn)不會足夠快或準(zhǔn)確到不足一毫秒。

此時(shí)我們要介紹的另一個(gè)問題是Thread.sleep(1)到底有多精確? 稍后我們將再次討論。

當(dāng)我們想暫停一微秒時(shí),另一個(gè)選擇是使用LockSupport.parkNanos(x) 。 使用以下代碼停泊1微秒實(shí)際上需要約10us。 它比TimeUnit.sleep()/ Thread.sleep()更好,但并不真正適合目的。 100us之后,它確實(shí)會以50%的變化進(jìn)入同一個(gè)球場。

package nanotime;import java.util.Arrays; import java.util.concurrent.TimeUnit;/*** Created by daniel on 28/10/2015.*/ public class NanoTimer {public static void main(String[] args) throws InterruptedException {long[] samples = new long[100_000];int pauseInMillis = 1;for (int i = 0; i < samples.length; i++) {long firstTime = System.nanoTime();LockSupport.parkNanos(pauseInMicros);long timeForNano = System.nanoTime() - firstTime;samples[i] = timeForNano;}System.out.printf("Time for LockSupport.parkNanos() %.0f\n", Arrays.stream(samples).average().getAsDouble());} }

解決我們問題的方法是使用System.nanoTime() 。 通過忙于等待對System.nanoTime的調(diào)用,我們將能夠暫停一微秒。 我們將在一秒鐘內(nèi)看到此代碼,但首先讓我們了解System.nanosecond()的準(zhǔn)確性。 至關(guān)重要的是,執(zhí)行對System.nanoSecond()的調(diào)用需要多長時(shí)間。

這是一些可以完全做到這一點(diǎn)的代碼:

package nanotime;public class NanoTimer {public static void main(String[] args) throws InterruptedException {long[] samples = new long[1_000_000];for (int i = 0; i < samples.length; i++) {long firstTime = System.nanoTime();long timeForNano = System.nanoTime() - firstTime;samples[i] = timeForNano;}System.out.printf("Time for call to nano %.0f nanseconds", Arrays.stream(samples).average().getAsDouble());} }

在我的MBP上,從一臺機(jī)器到另一臺機(jī)器,數(shù)字將有所不同,大約為40納秒。

這告訴我們,我們應(yīng)該能夠測量大約40納秒的精度。 因此,應(yīng)該很容易測量到1微秒(1000納秒)。

這是忙碌的等待方法,“暫停”了微秒:

package nanotime;import java.util.Arrays; /*** Created by daniel on 28/10/2015.*/ public class NanoTimer {public static void main(String[] args) throws InterruptedException {long[] samples = new long[100_000];int pauseInMicros = 1;for (int i = 0; i < samples.length; i++) {long firstTime = System.nanoTime();busyWaitMicros(pauseInMicros);long timeForNano = System.nanoTime() - firstTime;samples[i] = timeForNano;}System.out.printf("Time for micro busyWait %.0f\n", Arrays.stream(samples).average().getAsDouble());}public static void busyWaitMicros(long micros){long waitUntil = System.nanoTime() + (micros * 1_000);while(waitUntil > System.nanoTime()){;}} }

該代碼等待一微秒,然后乘以等待時(shí)間。 在我的機(jī)器上,我得到1,115納秒,準(zhǔn)確度在90%左右。

當(dāng)您等待更長的時(shí)間時(shí),精度會提高,10毫秒需要10,267納秒,即97%的準(zhǔn)確度,而100毫秒需要100,497納秒,即99.5%的準(zhǔn)確度。

那么Thread.sleep(1)到底有多精確?

這是代碼:

package nanotime;import java.util.Arrays; import java.util.concurrent.TimeUnit;/*** Created by daniel on 28/10/2015.*/ public class NanoTimer {public static void main(String[] args) throws InterruptedException {long[] samples = new long[100_000];int pauseInMillis = 1;for (int i = 0; i < samples.length; i++) {long firstTime = System.nanoTime();Thread.sleep(pauseInMicros);long timeForNano = System.nanoTime() - firstTime;samples[i] = timeForNano;}System.out.printf("Time for micro sleep %.0f\n", Arrays.stream(samples).average().getAsDouble());} }

1毫秒睡眠的平均時(shí)間(以納秒為單位)為1,295,509。 準(zhǔn)確率只有?75%。 對于幾乎所有內(nèi)容,它可能已經(jīng)足夠好了,但是如果您想要精確的毫秒級暫停,那么忙碌的等待會更好。 當(dāng)然,您需要記住繁忙的等待,按照定義,繁忙的等待會使您的線程繁忙,并會花費(fèi)您CPU的時(shí)間。

匯總表

暫停方式 1us 10us 100us 1000us / 1ms 10,000us / 10ms
TimeUnit.Sleep() 1284.6 1293.8 1295.7 1292.7 11865.3
LockSupport.parkNanos() 8.1 28.4 141.8 1294.3 11834.2
忙等待 1.1 10.1 100.2 1000.2 10000.2

結(jié)論

  • 如果您想暫停不到一毫秒,則需要忙于等待
  • System.nanoSecond()大約需要40ns
  • Thread.sleep(1)的準(zhǔn)確率只有75%
  • 忙于等待超過10us或更高的時(shí)間幾乎是100%準(zhǔn)確
  • 繁忙的等待將占用CPU

翻譯自: https://www.javacodegeeks.com/2015/11/lets-pause-for-a-microsecond.html

linux 延時(shí)一微秒

總結(jié)

以上是生活随笔為你收集整理的linux 延时一微秒_让我们暂停一微秒的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。