1. 程式人生 > >關於 x86_64 架構下 atomic、mutex、rwlock 的效能對比

關於 x86_64 架構下 atomic、mutex、rwlock 的效能對比

這裡以多執行緒操作long型別變數,進行加法運算1億次的時間作為效能對比的標準。

測試使用SLES 11SP2作業系統,3.0.80核心,CPU使用Xeon 55062 socket, 4 cores, 1thread

由於針對64位型別的atomic glibc沒有提供相應的庫,將核心實現程式碼移植到應用層

atomic64.h

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485 #ifndef __HI_ATOMIC64_H__#define __HI_ATOMIC64_H__#include <stdio.h>#include <getopt.h>#include <limits.h>
#include <stdlib.h>#include <string.h>#include <unistd.h>#include <pthread.h>#include <sys/time.h>#include <arpa/inet.h>#include <fcntl.h>#include <signal.h>#include <errno.h>#include <sys/time.h>/* Learn from kernel */#ifdef __x86_64__#define LOCK_PREFIX "lock ;"
typedefstruct{longlongcounter;}atomic64_t;/** * atomic64_read - read atomic64 variable * @v: pointer of type atomic64_t * * Atomically reads the value of <a href="http://www.jobbole.com/members/q1317827412">@v.</a> * Doesn't imply a read memory barrier. */staticinline longatomic64_read(constatomic64_t *v){return(*(volatile long*)&(v)->counter);}/** * atomic64_set - set atomic64 variable * @v: pointer to type atomic64_t * @i: required value * * Atomically sets the value of <a href="http://www.jobbole.com/members/shoujiliuyi6455">@v</a> to @i. */staticinline voidatomic64_set(atomic64_t *v,longi){v->counter=i;}/** * atomic64_add - add integer to atomic64 variable * @i: integer value to add * @v: pointer to type atomic64_t * * Atomically adds <a href="http://www.jobbole.com/members/zhoann">@i</a> to <a href="http://www.jobbole.com/members/q1317827412">@v.</a> */staticinline voidatomic64_add(longi,atomic64_t *v){asm volatile(LOCK_PREFIX"addq %1,%0":"=m"(v->counter):"er"(i),"m"(v->counter));}/** * atomic64_sub - subtract the atomic64 variable * @i: integer value to subtract * @v: pointer to type atomic64_t * * Atomically subtracts <a href="http://www.jobbole.com/members/zhoann">@i</a> from <a href="http://www.jobbole.com/members/q1317827412">@v.</a> */staticinline voidatomic64_sub(longi,atomic64_t *v){asm volatile(LOCK_PREFIX"subq %1,%0":"=m"(v->counter):"er"(i),"m"(v->counter));}#else /* __x86_64__ *//*FIXME: * This program will run on x86_64 machine in the expected future, we * do _not_ need to care other cpu architecture. */#endif#endif

測試程式碼performance.c

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146 /*******************************************************************************  Copyright(c) 2008-2014   This program is free software; you can redistribute it and/or modify it  under the terms and conditions of the GNU General Public License,  version 2, as published by the Free Software Foundation.  This program is distributed in the hope it will be useful, but WITHOUT  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or  FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for  more details.  You should have received a copy of the GNU General Public License along with  this program; if not, write to the Free Software Foundation, Inc.,  51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.  The full GNU General Public License is included in this distribution in  the file called "COPYING".  Date: 2014-04-15 21:27:57 CST  Contact Information:  Tony <[email protected]>  Home, Qingdao, China. *******************************************************************************/#include "atomic64.h"atomic64_t num;longmutexnum=0;longmaxnum;structtimeval tv;longstarttime;//FIXME: gettimeofday is a non-thread safe sysycallstaticpthread_mutex_t timelock=PTHREAD_MUTEX_INITIALIZER;#define TIME_LOCK() pthread_mutex_lock(&timelock)#define TIME_UNLOCK() pthread_mutex_unlock(&timelock)staticpthread_mutex_t numlock=PTHREAD_MUTEX_INITIALIZER;#define MUTEX_LOCK() pthread_mutex_lock(&numlock)#define MUTEX_UNLOCK() pthread_mutex_unlock(&numlock)staticpthread_rwlock_t rwnumlock=PTHREAD_RWLOCK_INITIALIZER;#define RW_LOCK() pthread_rwlock_wrlock(&rwnumlock)#define RW_UNLOCK() pthread_rwlock_unlock(&rwnumlock);staticvoid*add_func(void*arg){longstoptime;while(1){atomic64_add(1,&num);if(atomic64_read(&num)>maxnum){TIME_LOCK();gettimeofday(&tv,0);TIME_UNLOCK();stoptime=(long)tv.tv_sec *(long)1000000+(long)tv.tv_usec;printf("Used %ld microseconds\n",stoptime-starttime);break;}}}staticvoid*add_func_rwlock(void*arg){longstoptime;while(1){RW_LOCK();++mutexnum;if(mutexnum>maxnum){RW_UNLOCK();TIME_LOCK();gettimeofday(&tv,0);TIME_UNLOCK();stoptime=(long)tv.tv_sec *(long)1000000+(long)tv.tv_usec;printf("Used %ld microseconds\n",stoptime-starttime);break;}RW_UNLOCK();}}staticvoid*add_func_mutex(void*arg){longstoptime;while(1){MUTEX_LOCK();++mutexnum;if(mutexnum>maxnum){MUTEX_UNLOCK();TIME_LOCK();gettimeofday(&tv,0);TIME_UNLOCK();stoptime=(long)tv.tv_sec *(long)1000000+(long)tv.tv_usec;printf("Used %ld microseconds\n",stoptime-starttime);break;}MUTEX_UNLOCK();}}#define ATOMIC_TYPE 0#define MUTEX_TYPE 1#define RW_TYPE 2intmain(intargc,char**argv){pthread_t thread;pthread_attr_t thread_attr;intthreadnum,i,

相關推薦

關於 x86_64 架構 atomicmutexrwlock效能對比

這裡以多執行緒操作long型別變數,進行加法運算1億次的時間作為效能對比的標準。 測試使用SLES 11SP2作業系統,3.0.80核心,CPU使用Xeon 5506(2 socket, 4 cores, 1thread) 由於針對64位型別的atomic gli

python3multiprocessingthreading和gevent效能對比----暨程序池執行緒池和協程池效能對比

        目前計算機程式一般會遇到兩類I/O:硬碟I/O和網路I/O。我就針對網路I/O的場景分析下python3下程序、執行緒、協程效率的對比。程序採用multiprocessing.Pool程序池,執行緒是自己封裝的程序池,協程採用gevent的庫。用python

CriticalSectionEventMutexSemaphores區別

臨界區(Critical Section)     保證在某一時刻只有一個執行緒能訪問資料的簡便辦法。在任意時刻只允許一個執行緒對共享資源進行訪問。如果有多個執行緒試圖同時訪問臨界區,那麼在有一個執行緒進入後其他所有試圖訪問此臨界區的執行緒將被掛起,並一直持續到進入臨界

x86_64架構函式呼叫過程分析

//被分析的C程式 int test1(int a1,int b1) { int c1; c1 = a1+b1; return c1; } int test2(int a2,char b2) { int c2; c2 =

[C#學習筆記之多執行緒2]多執行緒同步與併發訪問共享資源工具—LockMonitorMutexSemaphore

“執行緒同步”的含義         當一個程序啟動了多個執行緒時,如果需要控制這些執行緒的推進順序(比如A執行緒必須等待B和C執行緒執行完畢之後才能繼續執行),則稱這些執行緒需要進行“執行緒同步(thread synchronization)”。         執行緒

KafkaActiveMQRabbitMQ及RocketMQ效能對比

特性 ActiveMQ RabbitMQ RocketMQ Kafka 單機吞吐量 萬級,比 RocketMQ、Kafka 低一個數量級 同 Activ

reduximmutablejs和mobx效能對比(三)

四、我的結論  通過第三部分的資料資料分析,我覺得我們可以得到以下結論: 無論是在開發環境還是測試環下頁面的首次載入速度結果都是:redux>immutablejs>mobx,但是他們之間的差距並不是很大。 10000條-100000條資料的頁面載入時間的增量明顯也高於10000-1000條資料

二叉查詢樹平衡二叉樹紅黑樹B-/B+樹效能對比

1. 二叉查詢樹 (Binary Search Tree) BST 的操作代價分析: (1) 查詢代價: 任何一個數據的查詢過程都需要從根結點出發,沿某一個路徑朝葉子結點前進。因此查詢中資料比較次數與樹的形態密切相關。  當樹中每個結點左右子樹高度大致相同時,樹高為

Collections.synchronizedList CopyOnWriteArrayListVector介紹原始碼淺析與效能對比【文末福利】

ArrayList執行緒安全問題 眾所周知,ArrayList不是執行緒安全的,在併發場景使用ArrayList可能會導致add內容為null,迭代時併發修改list內容拋ConcurrentModificationException異常等問題。java類庫裡面提供了以下三個輪子可以實現執行緒安全的List,

Net Core多種ORM框架特性及效能對比

                在.NET Framework下有許多ORM框架,最著名的無外乎是Entity Frame

iOS 指令集架構 armv6armv7armv7sarm64x86_64i386

clas 通用 圖片 pil 而後 支持 iphone 8 地址 目標 一、ARM架構   ARM架構過去稱作進階精簡指令集機器(Advanced RISC Machine,更早稱作:Acorn RISC Machine),是一個32位精簡指令集(RISC)處理器架構,AR

19-03redis主從架構如何才能做到99.99%的高可用性?

1、什麼是99.99%高可用? 架構上,高可用性,99.99%的高可用性 講的學術,99.99%,公式,系統可用的時間 / 系統故障的時間,365天,在365天 * 99.99%的時間內,你的系統都是可以嘩嘩對外提供服務的,那就是高可用性,99.99% 系統可用的時間 / 總的時間 = 高可用性

centos7搭建hadoophbasehivespark分散式系統架構

全棧工程師開發手冊 (作者:欒鵬) 在使用前建議先將當前使用者設定為root使用者。參考https://blog.csdn.net/luanpeng825485697/article/details/80278383中修改使用者許可權的第三種方法。有了

多語言(Java.NETNode.js)混合架構開源調用鏈追蹤APM項目初步選型

try 進行 The 語言 active istio .net core ref 配置 1. 背景 我們的技術棧包括了Java、.NET、Node.js等,並且采用了分布式的技術架構,系統性能管理、問題排查成本越來越高。 2. 基本訴求 針對我們的情況,這裏列出了選型

ListSetMap各類型的對比

hashtable class ray hashmap 速查 使用 線程同步 highlight ash 1.List和Set: List: 元素有放入順序,元素可重復,查找效率高,插入刪除效率低; Set: 元素無放入順序,元素不可重復,(元素雖然無順序,但元素在Set

linux環境部署zabbix3.2模板郵件告警詳細過程

-1 ice erer without zlib zip ever native item 服務端部署: 系統環境及軟件版本: Linux:release 6.3 zabbix:zabbix-3.2.5.tar.gz nginx:nginx-1.12.0.tar.gz ph

go語言sync包的學習(MutexWaitGroupCond)

pri lee 拷貝 light 等待 runt broadcast 計算 混亂 package main; import ( "fmt" "sync" "runtime" "time" ) //加鎖,註意鎖要以指針的形式傳進來,不然只是拷

Atitit 如何創新 創新只有在兩種條件發生:自由效率。

會議 center 有用 渠道 城市 catch 編輯 .net 工程 Atitit 如何創新 創新只有在兩種條件下發生:自由、效率。 創新是如何發生的呢? 創新只有在兩種條件下發生:自由、效率。在自由的環境下,對效率的追逐等於創新。如果你不自由,你的思想不夠開闊,

Oracle學習筆記—oracle體系架構及狀態(nomountmount和open)簡介

位置 正常 處理 管理 共享服務器 體系 操作記錄 sysdba png oracle體系架構簡介 先來簡要了解一下Oracle數據庫體系架構以便於後面深入理解,Oracle Server主要由實例(instance)和數據庫(database)組成。實例(instance

centos6.5安裝python3安裝python3虛擬環境創建venv

替代品 虛擬環境 由於 需要 tools python2.6 ipy模塊 python2 pip3   原因:在安裝完centos6.5後,通過命令行鍵入python時,默認為python2.6.6版本,系統並沒有安裝python3版本。又想學習python3,因此需要在c