精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

C++性能真的不如C嗎?

開發 后端
眾所周知,C++兼容了C的所有功能,顯然從所有角度去對比分析是不現實的,所以本文從我們常用的輸入輸出即標準流(iostream和stdio)的角度來分析講解。

最近在知乎上看了篇帖子,題目是為什么C++沒有C語言快,如下圖:

恰好之前研究過這塊,所以借助本文,分析下這個問題(無意于語言之爭,單純是從技術角度??)。

眾所周知,C++兼容了C的所有功能,顯然從所有角度去對比分析是不現實的,所以本文從我們常用的輸入輸出即標準流(iostream和stdio)的角度來分析講解。

示例

為了更加直觀地來對比分析,寫了個示例,通過scanf和cin讀文件,然后分析兩種方式的性能高低,代碼如下:

#include <chrono>
#include <functional>
#include <iostream>
#include <fstream>
const int num=1000000;
void time_report(const std::function<void()> &f1, const std::function<void()> &f2) {
auto start = std::chrono::high_resolution_clock::now();
f1();
auto end = std::chrono::high_resolution_clock::now();
std::cout << "cin cost " << std::chrono::duration_cast<std::chrono::milliseconds>(end - start).count() << "ms" << std::endl;
start = std::chrono::high_resolution_clock::now();
f2();
end = std::chrono::high_resolution_clock::now();
std::cout << "scanf cost " << std::chrono::duration_cast<std::chrono::milliseconds>(end - start).count() << "ms" << std::endl;
}
void write() {
std::ofstream file("./data");
for(int i = 0; i < num; ++i) {
file << rand() <<' ';
if((i + 1) % 20 == 0) {
file << std::endl;
}
}
}
int main() {
write();

time_report([](){
freopen("./data","r",stdin);
int n = 0;
for(int i=0; i<num; i++) {
std::cin >> n;
}
}, [](){
freopen("./data","r",stdin);
int n = 0;
for(int i = 0; i < num; ++i) {
scanf("%d", &n);
}
});
return 0;
}

編譯,運行之后,輸出如下:

cin cost 686ms
scanf cost 189ms

從上述輸出來看,cin的耗時是scanf的3倍多,果真如此么?

sync_with_stdio

C++性能真的差C這么多嗎?直接顛覆了對C++的認知,即使性能真的低,也得知道為什么低吧,于是開始研究,發現C++為了兼容C,在C標準流(stdio)和C++標準流(iostrem)保持同步,這樣就可以混合使用C和C++風格的I/O,且能保證得到合理和預期的結果,而正是這個同步導致C++在cin性能上有損失。如果禁用同步,則允許C++流擁有自己的獨立緩沖區,這樣性能就會提升很多。

那么是否可以禁用該同步功能呢?

C++提供了一個函數std::ios::sync_with_stdio,聲明如下:

static bool sync_with_stdio(bool __sync = true);

如果參數為false,則代表禁用此同步。從上面聲明可以看出,默認情況下 __sync = true也就是說禁用同步,而如果__sync為false的話,則會有如下操作:

bool
ios_base::sync_with_stdio(bool __sync) {
bool __ret = ios_base::Init::_S_synced_with_stdio;

if (!__sync && __ret) {
// ...
cout.rdbuf(&buf_cout);
cin.rdbuf(&buf_cin);
cerr.rdbuf(&buf_cerr);
clog.rdbuf(&buf_cerr);
// ...
}
return __ret;
}

從上述代碼,進一步驗證了我們上面的說法,如果禁用了同步功能,則C++流使用自己的緩沖區buf_cin(此處以cin為例),幾種buffer的定義如下:

typedef char fake_filebuf[sizeof(stdio_filebuf<char>)]
__attribute__ ((aligned(__alignof__(stdio_filebuf<char>))));
fake_filebuf buf_cout;
fake_filebuf buf_cin;
fake_filebuf buf_cerr;

好了,截止到現在,我們已經搞清楚了為什么C++流性能要慢于C,為了驗證是否真的是因為使用了同步功能而導致的性能差異,使用std::ios::sync_with_stdio(false)關閉同步,代碼示例如下:

#include <chrono>
#include <functional>
#include <iostream>
#include <fstream>
const int num=1000000;
void time_report(const std::function<void()> &f1, const std::function<void()> &f2) {
auto start = std::chrono::high_resolution_clock::now();
f1();
auto end = std::chrono::high_resolution_clock::now();
std::cout << "cin cost " << std::chrono::duration_cast<std::chrono::milliseconds>(end - start).count() << "ms" << std::endl;
start = std::chrono::high_resolution_clock::now();
f2();
end = std::chrono::high_resolution_clock::now();
std::cout << "scanf cost " << std::chrono::duration_cast<std::chrono::milliseconds>(end - start).count() << "ms" << std::endl;
}
void write() {
std::ofstream file("./data");
for(int i = 0; i < num; ++i) {
file << rand() <<' ';
if((i + 1) % 20 == 0) {
file << std::endl;
}
}
}
int main() {
std::ios::sync_with_stdio(false);
write();
time_report([](){
freopen("./data","r",stdin);
int n = 0;
for(int i=0; i<num; i++) {
std::cin >> n;
}
}, [](){
freopen("./data","r",stdin);
int n = 0;
for(int i = 0; i < num; ++i) {
scanf("%d", &n);
}
});
return 0;
}

編譯,運行后,輸出如下:

cin cost 178ms
scanf cost 189ms

可以看出禁用同步后,二者的性能基本一致。

既然禁用同步后,C++流的性能與C基本一致,那么是否直接禁用呢?答案是依賴于具體的使用場景。

1、同步的C++流是線程安全的,也就說來自不同線程的輸出可能會交錯,但數據不會產生競爭,而如果禁用同步,則可能出現意想不到的結果。

2、如果禁用了同步功能,輸入輸出順序可能會得不到我們想要的結果。

#include <stdio.h>
#include <iostream>
int main() {
std::cout << "a ";
printf("b ");
std::cout << "c ";
return 0;
}

上述代碼執行后,輸出a b c ,符合我們的預期。

如果加上禁用同步代碼,如下:

#include <stdio.h>
#include <iostream>
int main() {
std::ios_base::sync_with_stdio(false);
std::cout << "a ";
printf("b ");
std::cout << "c ";
return 0;
}

編譯、運行之后,結果為a c b,與我們期望的不一致。

結語

如果使用C編程,那么使用C stdio,而如果使用C++編程,則建議使用C++ I/O。如果在某些特殊場景下,需要混合使用,那么強烈建議不要禁用同步,否則會得到意想不到的結果。

責任編輯:龐桂玉 來源: C語言與C++編程
相關推薦

2015-09-07 13:55:53

PHPC++

2010-01-21 10:23:53

C++代碼

2010-01-26 09:24:53

C++語言

2010-01-15 16:45:35

C++語言

2010-01-14 10:34:02

C++語言

2010-01-20 17:23:03

C++編程語言

2010-01-20 10:14:53

C++程序

2010-01-14 13:24:49

CC++語言

2010-01-21 17:14:40

C++兼容

2010-01-14 14:55:14

C++編譯器

2010-01-18 11:12:36

2010-01-14 10:06:30

C++模板

2021-06-10 09:40:12

C++性能優化Linux

2024-12-27 09:29:09

2021-07-11 18:04:04

C語言

2014-04-17 10:37:43

C++.NET Native

2010-01-14 17:52:02

2024-06-24 12:41:40

2011-07-14 17:45:06

CC++

2010-01-21 14:07:14

CC++聲明
點贊
收藏

51CTO技術棧公眾號

精品一区二区三区免费毛片爱| 日韩免费一级| 国产亚洲精品超碰| 日本一区二区在线免费播放| 国产精品扒开腿做爽爽| 日本免费一区二区三区四区| 久久综合久久99| 国产精品视频播放| 青草影院在线观看| 欧亚精品一区| 91福利在线导航| 一区二区三区精品国产| www久久久久久| 99视频一区| 99久久久精品免费观看国产蜜| 91精品国产777在线观看| 黑人巨大精品欧美| 亚洲综合资源| 午夜久久久影院| 日韩高清在线播放| 亚洲AV无码精品自拍| 性欧美暴力猛交另类hd| 久热精品在线视频| 日本黄色网址大全| 久久99精品久久久野外观看| 欧美日韩性视频在线| 亚洲午夜精品久久久中文影院av| www.成人免费视频| 日韩精品成人一区二区在线| 欧美精品手机在线| 国产一二三四五区| 伊人久久亚洲| 欧美午夜免费电影| 黄色成人在线看| 欧美日韩免费做爰大片| 一区二区三区中文| 日韩视频在线一区二区| 国产第一页视频| 午夜在线视频免费| 久久99在线观看| 91成人精品网站| 青娱乐国产在线视频| 成人免费在线观看av| 精品福利在线导航| 亚洲精品综合在线观看| 乡村艳史在线观看| 一个色综合网站| 一区二区三区av| 黄色av网站在线| 99国产精品视频免费观看| 亚洲精品免费网站| 怡春院在线视频| 玖玖精品视频| 国产91精品久久久久久| 黄色一级视频在线观看| 欧美啪啪小视频| 欧美一级片免费在线| 一区二区免费av| 色是在线视频| 亚洲一区二区三区视频在线播放| 亚洲午夜精品久久久久久浪潮| 飘雪影视在线观看免费观看| 粉嫩aⅴ一区二区三区四区| 国产在线视频一区| 嫩草影院一区二区三区| 西西人体一区二区| 91av视频在线| 黄色片视频网站| 日本一区二区三区在线免费观看| 国产精品美女一区二区| 先锋影音国产精品| 色噜噜在线播放| 无码人妻一区二区三区免费n鬼沢 久久久无码人妻精品无码 | av动漫免费看| 真实新婚偷拍xxxxx| 91久久在线| 欧美激情日韩图片| 久久免费精彩视频| 国产一区观看| 久久成人在线视频| 久久中文免费视频| 欧美一区二区| 欧美老女人在线视频| 亚洲av鲁丝一区二区三区| 91精品精品| 精品中文字幕在线| 精品无码人妻一区二区三区| 一区二区亚洲精品| 97视频在线观看免费| 亚洲午夜18毛片在线看| 久久国产毛片| 日韩美女视频免费看| 亚洲精品成人在线视频| 老色鬼久久亚洲一区二区| 国产精品久久久久久超碰| 亚洲天堂av网站| 超碰在线亚洲| 日韩国产精品亚洲а∨天堂免| 色婷婷在线影院| 大片网站久久| 欧美夫妻性生活视频| 日韩xxx高潮hd| 狂野欧美一区| 91麻豆精品秘密入口| 黄色一级a毛片| 久久亚洲一区二区三区四区| 亚洲欧洲精品一区二区三区波多野1战4 | 夜夜夜夜夜夜操| 久久wwww| 日韩av在线免费观看| 懂色av粉嫩av浪潮av| 自拍偷拍欧美| 久久久久久久999| 国产精品午夜一区二区| 粉嫩一区二区三区在线看| 久久久久久国产精品免费免费| 国产资源在线观看| 亚洲综合成人在线视频| 日本女优爱爱视频| 久久久国产精品入口麻豆| 日韩久久精品电影| 欧美爱爱免费视频| 久久久久综合| 成人av男人的天堂| 国产一二三在线观看| 亚洲欧洲制服丝袜| 久久久久久人妻一区二区三区| 黑人巨大亚洲一区二区久 | 欧美一区二区福利| 国产成人午夜| 欧美日韩亚洲系列| 永久免费黄色片| 精品一区二区三| 久久久免费在线观看| 亚洲一级黄色大片| 91欧美一区二区| 国产欧美综合一区| 免费污视频在线一区| 亚洲成人av片| 国产97免费视频| 日韩电影在线看| 精品一区二区三区免费毛片| 成人日韩欧美| 欧美日本一区二区| 伊人网在线视频观看| 亚洲免费二区| ccyy激情综合| 老司机午夜在线| 国产模特av私拍大尺度| 日韩免费黄色片| 中国美女黄色一级片| 亚洲图片综合网| 色姑娘综合天天| 三年中文高清在线观看第6集| 中日韩精品视频在线观看| 蜜臀av性久久久久蜜臀aⅴ四虎| 成人18视频| 岛国中文字幕在线| 欧美日韩一区三区| 我不卡一区二区| 香蕉久久久久久久av网站| 国产精品18毛片一区二区| 老司机免费在线视频| 欧美三级电影网站| 黄色片在线观看免费| 久久永久免费| 日本一区二区精品视频| 97在线视频国产| 中文字幕天堂在线| 国产精品国产自产拍高清av| 久久国产激情视频| 欧美激情无毛| 精品国产_亚洲人成在线| 成人在线爆射| 久久久精品美女| 亚洲国产日韩在线观看| 富二代精品短视频| 天天操天天舔天天射| 精品一区二区三区蜜桃| 精品少妇人欧美激情在线观看| 天海翼亚洲一区二区三区| 国产精品igao视频| av网站网址在线观看| 亚洲第一页在线| 无码视频在线观看| 亚洲欧美国产三级| 右手影院亚洲欧美 | 国产三区在线视频| 欧洲视频一区| av资源一区二区| 欧美大电影免费观看| 久久视频在线免费观看| 三级在线观看网站| free性欧美| 你懂的视频在线免费| 高h视频在线| xxx.xxx欧美| 999色成人| 成人一区不卡| 久久成人一区| 久久蜜桃一区二区| 亚洲免费看黄网站| 亚洲欧美国产视频| 日韩免费视频网站| 国产精品视频yy9299一区| wwwxxx色| 成人在线视频你懂的| 日韩暖暖在线视频| 欧美色图天堂| 在线日韩第一页| 日日夜夜精品免费| 777久久久精品| 69视频免费看| 亚洲一区二区三区不卡国产欧美| www.日本高清视频| 97精品视频在线观看自产线路二| 91女神在线观看| 久久久久综合| 国产黄页在线观看| 欧美福利影院| 在线精品日韩| 欧美丝袜激情| 久久影院理伦片| 国产一级成人av| 亚洲综合在线做性| 欧美视频精品| 国产精品高清在线观看| 激情黄产视频在线免费观看| 美女黄色丝袜一区| 欧美日本高清| 日韩中文字幕网站| 超碰国产在线| 一本一道久久a久久精品逆3p| 凸凹人妻人人澡人人添| 亚洲精品激情| 老司机免费视频一区二区三区| 亚洲欧美日韩久久| 亚洲乱码国产乱码精品精天堂| 成人精品一区二区三区电影黑人| 日韩五码在线观看| 久久免费看少妇高潮v片特黄| 手机在线观看毛片| 九七电影院97理论片久久tvb| 国产大片一区| 2025国产精品视频| 国产夫妻在线| 97精品久久久| 欧美极品videos大乳护士| 高清欧美性猛交xxxx| 亚洲色图美国十次| 欧美福利视频在线| 6699嫩草久久久精品影院| 久久久久国产精品免费| 超黄网站在线观看| 97在线视频精品| 成人av观看| 国产精品嫩草影院一区二区| 国产亚洲精品精品国产亚洲综合| 国产精品影院在线观看| 欧美日韩破处视频| 91亚洲精品丁香在线观看| 亚洲一区电影| 黄色91av| 精品高清在线| 99热一区二区三区| 一区三区视频| 国产欧美高清在线| 蜜桃av一区二区| 韩国三级丰满少妇高潮| 成人小视频在线| 久久国产精品影院| 国产精品污www在线观看| 国产精品夜夜夜爽阿娇| 樱花影视一区二区| 久久久久久久极品| 欧美性xxxxx极品少妇| 国产视频在线一区| 亚洲国产古装精品网站| 国产美女视频一区二区三区| xx视频.9999.com| 9765激情中文在线| 国产精品久久久一区| 日本超碰一区二区| 久久青青草原一区二区| 日本不卡高清| 97在线国产视频| 日韩av午夜在线观看| 亚欧美一区二区三区| 99视频精品免费视频| 长河落日免费高清观看| 亚洲图片欧美一区| 国产精品熟女视频| 日韩亚洲欧美一区| 免费在线稳定资源站| 麻豆乱码国产一区二区三区| 国产传媒在线| 亚洲永久在线观看| 国产最新精品| 亚洲国产精品无码观看久久| 日韩和的一区二区| 蜜臀aⅴ国产精品久久久国产老师| 久久精品亚洲一区二区三区浴池| 丝袜美腿小色网| 91国偷自产一区二区使用方法| 亚洲爱情岛论坛永久| 欲色天天网综合久久| www中文字幕在线观看| 91视频国产一区| 欧美最新另类人妖| 国产va亚洲va在线va| 国模大尺度一区二区三区| 亚洲精品成人无码熟妇在线| 一区二区成人在线观看| 97精品人妻一区二区三区| 亚洲欧洲av一区二区| av在线不卡免费| 114国产精品久久免费观看| 欧美一区二区三区激情视频| 欧美爱爱视频免费看| 国产成人在线视频免费播放| 人妻互换一区二区激情偷拍| 日韩欧美在线第一页| 色哟哟中文字幕| 欧美富婆性猛交| 9999精品| 一区二区三区视频| 免费看欧美女人艹b| 欧美性猛交xxxx乱| 欧美天天综合色影久久精品| 欧美一区二区三区成人片在线| 久久亚洲影音av资源网| 久久69成人| 亚洲一区不卡在线| 男人的j进女人的j一区| 欧美黄色一级生活片| 懂色av一区二区三区| 日韩一区二区三区不卡| 欧美激情欧美激情在线五月| 久久伊人影院| avove在线观看| 国产激情一区二区三区桃花岛亚洲| 刘亦菲国产毛片bd| 欧美在线看片a免费观看| 国产日韩精品在线看| 国产精品对白刺激| 精品国产一区二区三区噜噜噜| 男人亚洲天堂网| 久久综合色一综合色88| 亚洲天堂视频网站| 亚洲精品自拍视频| 日本久久免费| 亚洲精品9999| 国产在线精品免费| 青青草在线观看视频| 欧美成人在线直播| 成人在线高清免费| 久久精品女人的天堂av| 久久亚洲欧洲| 国产在线免费av| 欧美二区乱c少妇| 青草青在线视频| 精品久久中出| 天堂成人国产精品一区| 四季av中文字幕| 91精品国产麻豆| av丝袜在线| 欧美日本亚洲| 久久99精品久久久久久| 欧美做爰爽爽爽爽爽爽| 精品国产91久久久久久久妲己 | 婷婷精品视频| 老头吃奶性行交视频| 国产精品久久久一本精品| 国产视频在线一区| 97超级碰碰人国产在线观看| 国产综合久久久| www.桃色.com| 精品欧美aⅴ在线网站| jyzzz在线观看视频| 91在线色戒在线| 香蕉精品999视频一区二区| 999福利视频| 亚洲国产天堂网精品网站| 经典三级一区二区| 强开小嫩苞一区二区三区网站| 成人午夜视频在线观看| 男操女视频网站| 欧美精品福利在线| 欧美色网址大全| 中文字幕a在线观看| 欧美日韩在线三级| 暧暧视频在线免费观看| 亚洲高清视频在线观看| 成人永久aaa| 亚洲天堂男人网| 69视频在线免费观看| 97国产精品| 97伦伦午夜电影理伦片| 日韩一本二本av| 成人国产精选|