1. 程式人生 > >執行緒上下文切換的效能損耗測試

執行緒上下文切換的效能損耗測試

執行緒上下文切換的效能損耗到底有多少,一直沒有直觀的理解,今天寫個程式測試一下。先看看下面的程式(點選下載):

image

ThreadTester是所有Tester的基類。所有的Tester都乾的是同樣一件事情,把counter增加到100000000,每次只能加1。

   1: public abstract class ThreadTester
   2:     {
   3:         public const long MAX_COUNTER_NUMBER = 100000000;
   4:  
   5:         private long _counter = 0;
   6:  
   7:         //獲得計數
   8:         public virtual long GetCounter()
   9:         {
  10:             return this._counter;
  11:         }
  12:  
  13:         //增加計數器
  14:         protected virtual void IncreaseCounter()
  15:         {
  16:             this._counter += 1;
  17:         }
  18:  
  19:         //啟動測試
  20:
public abstract void Start();
  21:  
  22:         //獲得Counter從開始增加到現在的數字所耗的時間
  23:         public abstract long GetElapsedMillisecondsOfIncreaseCounter();
  24:  
  25:         //測試是否正在執行
  26:         public abstract bool IsTesterRunning();
  27:     }

SingleThreadTester是單執行緒計數。

   1: class
SingleThreadTester : ThreadTester
   2:     {
   3:         private Stopwatch _aStopWatch = new Stopwatch();
   4:  
   5:         public override void Start()
   6:         {
   7:             _aStopWatch.Start();
   8:  
   9:             Thread aThread = new Thread(() => WorkInThread());
  10:             aThread.Start();
  11:         }
  12:  
  13:         public override long GetElapsedMillisecondsOfIncreaseCounter()
  14:         {
  15:             return this._aStopWatch.ElapsedMilliseconds;
  16:         }
  17:  
  18:         public override bool IsTesterRunning()
  19:         {
  20:             return _aStopWatch.IsRunning;
  21:         }
  22:  
  23:         private void WorkInThread()
  24:         {
  25:             while (true)
  26:             {
  27:                 if (this.GetCounter() > ThreadTester.MAX_COUNTER_NUMBER)
  28:                 {
  29:                     _aStopWatch.Stop();
  30:                     break;
  31:                 }
  32:  
  33:                 this.IncreaseCounter();
  34:             }
  35:         }
  36:     }

TwoThreadSwitchTester是兩個執行緒交替計數。

   1: class TwoThreadSwitchTester : ThreadTester
   2:     {
   3:         private Stopwatch _aStopWatch = new Stopwatch();
   4:         private AutoResetEvent _autoResetEvent = new AutoResetEvent(false);
   5:  
   6:         public override void Start()
   7:         {
   8:             _aStopWatch.Start();
   9:  
  10:             Thread aThread1 = new Thread(() => Work1InThread());
  11:             aThread1.Start();
  12:  
  13:             Thread aThread2 = new Thread(() => Work2InThread());
  14:             aThread2.Start();
  15:         }
  16:  
  17:         public override long GetElapsedMillisecondsOfIncreaseCounter()
  18:         {
  19:             return this._aStopWatch.ElapsedMilliseconds;
  20:         }
  21:  
  22:         public override bool IsTesterRunning()
  23:         {
  24:             return _aStopWatch.IsRunning;
  25:         }
  26:  
  27:         private void Work1InThread()
  28:         {
  29:             while (true)
  30:             {
  31:                 _autoResetEvent.WaitOne();
  32:                 
  33:                 this.IncreaseCounter();
  34:  
  35:                 if (this.GetCounter() > ThreadTester.MAX_COUNTER_NUMBER)
  36:                 {
  37:                     _aStopWatch.Stop();
  38:                     break;
  39:                 }
  40:  
  41:                 _autoResetEvent.Set();
  42:             }
  43:         }
  44:  
  45:         private void Work2InThread()
  46:         {
  47:             while (true)
  48:             {
  49:                 _autoResetEvent.Set();
  50:                 _autoResetEvent.WaitOne();
  51:                 this.IncreaseCounter();
  52:  
  53:                 if (this.GetCounter() > ThreadTester.MAX_COUNTER_NUMBER)
  54:                 {
  55:                     _aStopWatch.Stop();
  56:                     break;
  57:                 }
  58:             }
  59:         }
  60:     }

MultiThreadTester可以指定執行緒數,多個執行緒爭搶計數。

   1: class MultiThreadTester : ThreadTester
   2:     {
   3:         private Stopwatch _aStopWatch = new Stopwatch();
   4:         private readonly int _threadCount = 0;
   5:         private readonly object _counterLock = new object();
   6:         Mutex mutex ;
   7:         public MultiThreadTester(int threadCount)
   8:         {
   9:             this._threadCount = threadCount;
  10:         }
  11:  
  12:         public override void Start()
  13:         {
   mutex = new Mutex(true);
             mutex.ReleaseMutex();
  14:             _aStopWatch.Start();
  15:  
  16:             for (int i = 0; i < _threadCount; i++)
  17:             {
  18:                 Thread aThread = new Thread(() => WorkInThread());
  19:                 aThread.Start();
  20:             }
  21:         }
  22:  
  23:         public override long GetElapsedMillisecondsOfIncreaseCounter()
  24:         {
  25:             return this._aStopWatch.ElapsedMilliseconds;
  26:         }
  27:  
  28:         public override bool IsTesterRunning()
  29:         {
  30:             return _aStopWatch.IsRunning;
  31:         }
  32:  
  33:         private void WorkInThread()
  34:         {
mutex.WaitOne();
  35:             while (true)
  36:             {
  37:                 //lock (_counterLock)
  38:                 //{
  39:                     if (this.GetCounter() > ThreadTester.MAX_COUNTER_NUMBER)
  40:                     {
  41:                         _aStopWatch.Stop();
  42:                         break;
  43:                     }
  44:  
  45:                     this.IncreaseCounter();
  46:                 //}
  47:             }
mutex.ReleaseMutex();
  48:         }
  49:     }

Program的Main函式中,根據使用者的選擇來決定執行哪個測試類。

   1: class Program
   2:     {
   3:         static void Main(string[] args)
   4:         {
   5:  
   6:             string inputText = GetUserChoice();
   7:  
   8:             while (!"4".Equals(inputText))
   9:             {
  10:                 ThreadTester tester = GreateThreadTesterByInputText(inputText);
  11:                 tester.Start();
  12:  
  13:                 while (true)
  14:                 {
  15:                     Console.WriteLine(GetStatusOfThreadTester(tester));
  16:                     if (!tester.IsTesterRunning())
  17:                     {
  18:                         break;
  19:                     }
  20:                     Thread.Sleep(100);
  21:                 }
  22:  
  23:                 inputText = GetUserChoice();
  24:             }
  25:  
  26:             Console.Write("Click enter to exit...");
  27:         }
  28:  
  29:         private static string GetStatusOfThreadTester(ThreadTester tester)
  30:         {
  31:             return string.Format("[耗時{0}ms] counter = {1}, {2}",
  32:                     tester.GetElapsedMillisecondsOfIncreaseCounter(), tester.GetCounter(),
  33:                     tester.IsTesterRunning() ? "running" : "stopped");
  34:         }
  35:  
  36:         private static ThreadTester GreateThreadTesterByInputText(string inputText)
  37:         {
  38:             switch (inputText)
  39:             {
  40:                 case "1":
  41:                     return new SingleThreadTester();
  42:                 case "2":
  43:                     return new TwoThreadSwitchTester();
  44:                 default:
  45:                     return new MultiThreadTester(100);
  46:             }
  47:         }
  48:  
  49:         private static string GetUserChoice()
  50:         {
  51:             Console.WriteLine(@"==Please select the option in the following list:==
  52: 1. SingleThreadTester
  53: 2. TwoThreadSwitchTester
  54: 3. MultiThreadTester
            
           

相關推薦

執行上下文切換效能損耗測試

執行緒上下文切換的效能損耗到底有多少,一直沒有直觀的理解,今天寫個程式測試一下。先看看下面的程式(點選下載): ThreadTester是所有Tester的基類。所有的Tester都乾的是同樣一件事情,把counter增加到100000000,每次只能加1。 1: public abstr

java基礎學習總結(二十):多執行上下文切換

什麼是上下文切換        即使是單核CPU也支援多執行緒執行程式碼,CPU通過給每個執行緒分配CPU時間片來實現這個機制。時間片是CPU分配給各個執行緒的時間,因為時間片非常短,所以CPU通過不停地切換執行緒執行,讓我們感覺多個執行緒時同時執行的,時

#java如何減少執行上下文切換?本文告訴你答案!

如何減少執行緒上下文切換 使用多執行緒時,不是多執行緒能提升程式的執行速度,使用多執行緒是為了更好地利用CPU資源! 如果有正在學java的程式設計師,可來我們的java技術學習扣qun哦:82368,6266裡面免費送java的視訊教程噢! 小編也是一名從事了

執行上下文切換和程序上下文切換的區別

程序切換分兩步1.切換頁目錄以使用新的地址空間2.切換核心棧和硬體上下文。對於linux來說,執行緒和程序的最大區別就在於地址空間。對於執行緒切換,第1步是不需要做的,第2是程序和執行緒切換都要做的。所以明顯是程序切換代價大 執行緒上下文切換和程序上下問切換一個最主要的區別是執行緒的切換虛擬記憶體空間依

執行--上下文切換

在開發的過程中,多執行緒一直很受歡迎,因為它的執行速度比序列要快,但是到底快多少呢?一定快麼?下面我們用一段程式碼來測試下 private static final long count = 100000; public static void ma

一篇文章帶你「重新認識」執行上下文切換怎麼玩兒

排程 當一個計算機是多道程式設計系統時,會頻繁的有很多程序或者執行緒來同時競爭 CPU 時間片。當兩個或兩個以上的程序/執行緒處於就緒狀態時,就會發生這種情況。如果只有一個 CPU 可用,那麼必須選擇接下來哪個程序/執行緒可以執行。作業系統中有一個叫做 排程程式(scheduler) 的角色存在,它就是做這件

C# SynchronizationContext執行上下文簡單說明

SynchronizationContext執行緒上下文說明 SynchronizationContext在通訊中充當傳輸者的角色,實現功能就是一個執行緒和另外一個執行緒的通訊  那麼SynchronizationContext的Send()和Post()   Send() 是簡單的

Hystrix中threadPoolProperties執行池各個屬性舉例測試

目前的工作場景是: 在一個專案中需要呼叫外部介面,此介面一次只能處理8個請求,多於8個請求過來,nginx會為了保護介面直接踢回請求(返回500null錯誤),而在本專案中使用了訊息佇列機制,所以有可能會一次從訊息佇列中消費多條資料,這時候就會有個別請求還沒有呼叫外部介

RxJava2.0(四)執行之間切換的內部原理

基本程式碼 來看一下基本程式碼: Observable.create((ObservableOnSubscribe<Integer>) e -> { e.onNext(1); e.onNext(2); e.onCo

Java執行狀態切換詳解

一、執行緒狀態說明 java.lang.Thread類中定義了執行緒狀態列舉java.lang.Thread.State,以下為各狀態說明。 1、NEW(新建) /** * Thread state for a thread whic

sysbench 多執行非同步io模擬mysql測試的指令碼

用於測試的指令碼:   for size in 100 do cd /mnt/stec sysbench --test=fileio --file-num=1 --file-total-size=${size}G prepare sync echo 3 > /proc/sys/vm/dr

程序間切換執行切換的區別

程序切換分兩步1.切換頁目錄以使用新的地址空間2.切換核心棧和硬體上下文。對於linux來說,執行緒和程序的最大區別就在於地址空間。對於執行緒切換,第1步是不需要做的,第2是程序和執行緒切換都要做的。所以明顯是程序切換代價大執行緒上下文切換和程序上下文切換一個最主要的區別是執

Java網路爬蟲(十)--使用多執行提升爬蟲效能的思路小結

在開始說正事之前我先給大家介紹一下這份程式碼的背景,以免大家有一種霧裡看花的感覺。在本系列的前幾篇部落格中有一篇是用多執行緒進行百度圖片的抓取,但是當時使用的多執行緒是非常粗略的,只是開了幾個執行緒讓抓取的速度提升了一些(其實提升了很多),初步的使用了一下執行緒

Context Switches上下文切換效能詳解

Context Switches 上下文切換,有時也被稱為程序切換(process switch)或任務切換。是一個重要的效能指標。 CPU從一個執行緒切換到另外一個執行緒,需要儲存當前任務的執行環境,恢復將要執行任務的執行環境,必然帶來效能消耗。 Context Switches 上下文切換簡介 作業系統

執行的優劣/效能/系統開銷

轉自:http://hi.baidu.com/goga/blog/item/ef7e8326af7ae31f8b82a103.html 執行緒建立之前 1.系統為執行緒分配並初始化一個執行緒核心物件; 2.系統為每個執行緒保留1MB的地址空間(按需提交)用於執行緒使用者模

Java多執行引發的效能問題以及調優策略

無限制建立執行緒 Web伺服器中,在正常負載情況下,為每個任務分配一個執行緒,能夠提升序列執行條件下的效能。只要請求的到達率不超出伺服器的請求處理能力,那麼這種方法可以同時帶來更快的響應性和更高的吞吐率。如果請求的到達速率非常高,且請求的處理過程是輕

二十一、JAVA多執行筆記:執行上下文設計模式(ThreadLocal)

        上下文是貫穿整個系統或階段生命週期的物件,其中包含了系統全域性的一些資訊,比如登入後的使用者資訊、賬號資訊,以及在程式每一個階段執行時的資料。         設計時要考慮到全域性唯一性,還要考慮有些

Java執行上下文類載入器與SPI

執行緒上下文類載入器(context class loader)是從JDK 1.2開始引入的。類 java.lang.Thread中的方法getContextClassLoader()和setContextClassLoader(ClassLoader cl)用來獲取和設定

05執行上下文類載入器

在JDK1.2後,可以使用getContextClassLoader()和setContextClassLoader()來獲取和設定當前執行緒的上下文類載入器,如果沒有設定,預設與父執行緒一致。 Java 提供了很多服務提供者介面(Service Provider Inte

執行WEB高併發壓力測試軟體JMeter

一、 Apache JMeter工具   1)簡介   JMeter——一個100%的純java桌面應用,它是 Apache組織的開放原始碼專案,它是功能和效能測試的工具。JMeter可以用於測試靜態或者動態資源的效能(檔案、Servlets、Perl指令碼、java物