精品国产一区在线_av无码中文字幕无码王_天海翼三点刺激高潮不停_好硬好大好爽视频_欧美高清一区三区在线专区_香蕉黄色片

徐土豆
認證:優質創作者
所在專題目錄 查看專題
C語言中去除不必要的內存引用可以有效地提高性能
C語言中內循環和外循環的位置可能產生性能上的區別
[C語言朝花夕拾] C語言中的命令行輸入參數判斷
用“位操作”取代“取模操作”判斷奇數偶數
c語言運行時出現segment fault的原因
一文理解C語言中的volatile修飾符
作者動態 更多
給定計算預算下的最佳LLM模型尺寸與預訓練數據量分配
05-19 09:33
大模型推理時的尺度擴展定律
05-18 10:32
世界多胞體與世界模型
05-13 09:42
獎勵模型中的尺度擴展定律和獎勵劫持
05-12 08:41
MeCo——給預訓練數據增加源信息,就能減少33%的訓練量并且提升效果
05-08 09:13

C語言中去除不必要的內存引用可以有效地提高性能

版權聲明:本文為博主原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。
在C語言中,我們經常會存在對某個內存地址進行引用的操作,也就是如下列代碼所示的,對指針進行取內容:
int vars[10];
int var = *(vars+3); //這里就是對數組vars的第三個元素進行引用
這種內存引用操作對應的匯編代碼通常如:
mov (%rax), %rdx; 
# 把地址位于%rax的內存值進行取出。
mov 12(%rax), %rdx;
# 把地址位于%rax+12的內存值進行取出。
我們注意到這種操作涉及到了CPU從數據總線中向內存中取值,通常速度遠遠慢于CPU本身的計算操作,也慢于CPU取出內部寄存器值的操作,很多時候,一個程序的計算瓶頸就在這些去內存的操作中,因此要盡量避免不必要的內存引用。以下舉個代碼例子進行進一步說明。
// code_1.c
#include <stdio.h>
void foo(float vars[], int length, float *sum){
	int i = 0;
	for (i = 0; i < length; i++){
		*sum = *sum * vars[i];
	}
}

int main(){
	float sum = 1;
	float vars[] = {0.3,0.4,0.13,0.65,0.23,0.87,0.2,1.34};
	int cycle = 0;
	for (cycle = 0; cycle < 100000000; cycle++){
		foo(vars, 8, &sum);
		sum = 1;
	}
	return 0;
}
// code_2.c
#include <stdio.h>
void foo(float vars[], int length, float *sum){
	int i = 0;
	int tmp = *sum;
	for (i = 0; i < length; i++){
		tmp = tmp * vars[i];
	}
	*sum = tmp;
}

int main(){
	float sum = 1;
	float vars[] = {0.3,0.4,0.13,0.65,0.23,0.87,0.2,1.34};
	int cycle = 0;
	for (cycle = 0; cycle < 100000000; cycle++){
		foo(vars, 8, &sum);
		sum = 1;
	}
	return 0;
}
code_1.ccode_2.c的差別很小,就是在于函數foo()中關于sum這個指針的指向的內容的更新方式,第一種方式是每一個循環中都進行更新,顯然其需要更多但是卻沒必要的內存引用,第二種通過一個臨時變量的形式,避免了多次頻繁無用地訪問內存。觀察其兩者的匯編,就會發現和我們之前分析的是一致的。我們采用-O1優化選項,命令如:
gcc -O1 -S code_1.c
gcc -O1 -S code_2.c
匯編結果如下所示(以下匯編只是截取部分關鍵信息)
# code_1.s
.L3:
	movss (%rdx), %xmm0
	mulss (%rax), %xmm0
	movss %xmm0, (%rdx)
	addq %4, %rax
	cmpq %rcx, %rax
	jne .L3
而第二個則簡單很多
# code_1.s
.L3:
	mulss (%rax), %xmm0
	addq %4, %rax
	cmpq %rcx, %rax
	jne .L3
我們發現,第一個代碼比起第二個代碼多出很多內存引用操作,其需要從內存中取出乘數 movss (%rdx), %xmm0,計算完之后,有需要更新,將其寫回內存, movss %xmm0, (%rdx)。導致其性能遜于后者。在筆者的服務器上,兩者的性能具體對比為:code 1跑了0.54s,而code 2跑了0.37s。

同時我們發現,編譯器很難對此進行優化,在-O1優化等級下,其表現和我們分析的并沒有區別(某些編譯器優化會導致代碼分析和實際的匯編有所區別),其還沒有能夠智能到對這種進行優化,因此需要程序員對此進行顯式地優化。
聲明:本內容為作者獨立觀點,不代表電子星球立場。未經允許不得轉載。授權事宜與稿件投訴,請聯系:editor@netbroad.com
覺得內容不錯的朋友,別忘了一鍵三連哦!
贊 2
收藏 3
關注 52
成為作者 賺取收益
全部留言
0/200
成為第一個和作者交流的人吧
主站蜘蛛池模板: 人与禽性视频7777 | 亚洲精品久久五月天堂 | 国产av无毛 | 少妇88久久中文字幕 | 99视频免费在线 | 最近高清中文在线国语字幕 | 人人人妻人人澡人人爽欧美一区 | 四虎永久免费在线观看 | 亚洲综合性av私人影院 | 柠檬福利视频导航 | 亚洲男人天堂电影 | aaaaa级少妇高潮大片 | 射射综合网 | 亚洲精品国产一区二区 | 另类人善交video | 亚洲高清视频免费观看 | 娇小videodes性爽hd| 69ww免费视频播放器 | 俄罗斯豪放女大兵 | 无码三级A在线观看 | 99久久久久久99国产精品免 | 91久久久久久亚洲精品蜜桃 | 免费在线黄色片 | 扒开粉嫩的小缝隙喷白浆 | porno18老师高清 | 99久无码中文字幕一本久道 | 一级黄色的毛片 | 99久久99久久免费精品 | 精品视频一区二区在线观看 | 短裙公车被直接进入被c视频在线 | 污污视频免费观看网站 | 日韩在线aⅴ免费视频 | 美国三级欧美一级 | 公厕美女bbbb撒尿 | 亚洲成av人片在线观看高清 | 青青草99 | 久久精品色欧美aⅴ一区二区 | 看全色黄大色黄大片视频 | 日本少妇中出 | 女人被狂躁高潮啊的视频在线看 | 欧美激情在线观看一区二区三区 |