因此,在少数评论中 我和各国人民一样回答说,问题很可能是你的C++版所做的额外复制,在版图中,它复制了这些线路。 但我要对此进行测试。
第一,我实施了植被和线性版本,并做了时间。 我确认,在减速模式中,电离层流放速度较慢,大约为130微克和60微克。 鉴于传统的智慧,即奥溪比使用分流缓慢,这是不值得称赞的。 然而,在过去,我的经验是,从优化开始,各流的步伐大大加快。 在我比较我的释放模式时间时证实了这一点:大约20微克使用线,48微克有植被。
至少在释放模式中,使用流线的速度比植被快,这违反了以下论点:复制所有数据必须比复制数据要慢,因此,我不敢肯定所有优化能够避免什么,而我确实没有想找到任何解释,但很想知道什么是最佳的。 edit:当我看一看方案概况时,显然如何比较业绩,因为不同方法所看的情况与另一个不同。
我想看到的是,我能否通过避免使用“<代码>get()”法复制有关单流物体,而这正是C文本正在做的。 当我这样做时,我非常惊讶地发现,使用<代码>fstream:植被(<>/代码)比粉碎和释放中的植被和线性方法要慢得多; de中的约230微克和80微克释放。
为了缩小减速幅度,我走过前面,并做了另一种版本,这次使用了附属于气流物体的溪流和<代码>snextc()。 该版本目前最快,排出25微克,释放6微克。
我猜测,使<代码>fstream:get()方法如此缓慢的事物是,它为每个电话构造一个切入物体。 虽然我没有检测过这一点,但我看不出,get()
远远超出了从溪流获得下一个特性的范围,只有这些重返物体除外。
Anyway, the moral of the story is that if you want fast io you re probably best off using high level iostream functions rather than stdio, and for really fast io access the underlying stream_buf. edit: actually this moral may only apply to MSVC, see update at bottom for results from a different toolchain.
参考:
我在时间方面使用了VS2010和chrono,从1.47升入。 我建造了32个轨道望远镜(由于能够找到64个轨道版本的微粒而需要增强速度)。 我 did击了汇编备选办法,但可能并非完全标准,因为我是在一纸空谈中这样做的。
文档一经测试的版本是:Frédéric Bastiat项目Frédéric Bastiat的1.1. MB 20,000行式平原文本,即:http://www.gutenberg.org/ebooks/35390“rel=”http://www.gutenberg.org/ebooks/35390。
释放方式
fgetc time is: 48150 microseconds
snextc time is: 6019 microseconds
get time is: 79600 microseconds
getline time is: 19881 microseconds
2. 变式时间:
fgetc time is: 59593 microseconds
snextc time is: 24915 microseconds
get time is: 228643 microseconds
getline time is: 130807 microseconds
载于我的<代码>fgetc(>版本:
{
auto begin = boost::chrono::high_resolution_clock::now();
FILE *cin = fopen("D:/bames/automata/pg35390.txt","rb");
assert(cin);
unsigned maxLength = 0;
unsigned i = 0;
int ch;
while(1) {
ch = fgetc(cin);
if(ch == 0x0A || ch == EOF) {
maxLength = std::max(i,maxLength);
i = 0;
if(ch==EOF)
break;
} else {
++i;
}
}
fclose(cin);
auto end = boost::chrono::high_resolution_clock::now();
std::cout << "max line is: " << maxLength <<
;
std::cout << "fgetc time is: " << boost::chrono::duration_cast<boost::chrono::microseconds>(end-begin) <<
;
}
载于我的<代码>getline(版):
{
auto begin = boost::chrono::high_resolution_clock::now();
std::ifstream fin("D:/bames/automata/pg35390.txt",std::ios::binary);
unsigned maxLength = 0;
std::string line;
while(std::getline(fin,line)) {
maxLength = std::max(line.size(),maxLength);
}
auto end = boost::chrono::high_resolution_clock::now();
std::cout << "max line is: " << maxLength <<
;
std::cout << "getline time is: " << boost::chrono::duration_cast<boost::chrono::microseconds>(end-begin) <<
;
}
<代码>fstream:get(
{
auto begin = boost::chrono::high_resolution_clock::now();
std::ifstream fin("D:/bames/automata/pg35390.txt",std::ios::binary);
unsigned maxLength = 0;
unsigned i = 0;
while(1) {
int ch = fin.get();
if(fin.good() && ch == 0x0A || fin.eof()) {
maxLength = std::max(i,maxLength);
i = 0;
if(fin.eof())
break;
} else {
++i;
}
}
auto end = boost::chrono::high_resolution_clock::now();
std::cout << "max line is: " << maxLength <<
;
std::cout << "get time is: " << boost::chrono::duration_cast<boost::chrono::microseconds>(end-begin) <<
;
}
www.un.org/chinese/sc/presidency.asp
{
auto begin = boost::chrono::high_resolution_clock::now();
std::ifstream fin("D:/bames/automata/pg35390.txt",std::ios::binary);
std::filebuf &buf = *fin.rdbuf();
unsigned maxLength = 0;
unsigned i = 0;
while(1) {
int ch = buf.snextc();
if(ch == 0x0A || ch == std::char_traits<char>::eof()) {
maxLength = std::max(i,maxLength);
i = 0;
if(ch == std::char_traits<char>::eof())
break;
} else {
++i;
}
}
auto end = boost::chrono::high_resolution_clock::now();
std::cout << "max line is: " << maxLength <<
;
std::cout << "snextc time is: " << boost::chrono::duration_cast<boost::chrono::microseconds>(end-begin) <<
;
}
update:
我将SOS X使用部族(中继)进行的测试与校准++相重。 基于流层的执行结果相对相同(优化使用);<代码>fstream:get(<>/code> 远低于std:getline(<>
> 远低于filebuf:snextc(
)。 但是,<代码>fgetc(>>的性能相对于getline(
)的履行情况有所改善,并且变得更快。 也许这是因为,通过<代码>getline()进行的复制成为这一工具链的一个问题,而与MSVC相比是没有的。 或许Microsoft s CRT实施fgetc()是坏的还是什么?
不管怎么说,这里是时候(我用了较大的档案,5.3甲基溴):
使用——
fgetc time is: 39004 microseconds
snextc time is: 19374 microseconds
get time is: 145233 microseconds
getline time is: 67316 microseconds
使用
fgetc time is: 44061 microseconds
snextc time is: 92894 microseconds
get time is: 184967 microseconds
getline time is: 209529 microseconds
-O2
fgetc time is: 39356 microseconds
snextc time is: 21324 microseconds
get time is: 149048 microseconds
getline time is: 63983 microseconds
-O3
fgetc time is: 37527 microseconds
snextc time is: 22863 microseconds
get time is: 145176 microseconds
getline time is: 67899 microseconds