每当我提到C++标准库iostream的慢性能时,我都会遇到一阵难以置信的风潮.然而,我有剖析器结果显示在iostream库代码中花费了大量时间(完全编译器优化),并且从iostream切换到特定于操作系统的I/O API和自定义缓冲区管理确实提供了一个数量级的改进.
C++标准库做了多少额外工作,标准是否需要它,它在实践中是否有用?或者有些编译器提供了与手动缓冲区管理竞争的iostream实现吗?
为了解决问题,我编写了几个简短的程序来练习iostreams内部缓冲:
ostringstream http://ideone.com/2PPYwchar[]缓冲区http://ideone.com/Ni5ctvector<char>使用http://ideone.com/Mj2Fi将二进制数据放入其中back_inserter vector<char>简单的迭代器http://ideone.com/9iitvstringbuf http://ideone.com/qc9QAvector<char>简单的迭代器加边界检查http://ideone.com/YyrKy请注意,ostringstream和stringbuf版本运行的迭代次数较少,因为它们的速度要慢得多.
在ideone上,它ostringstream比std:copy+ back_inserter+ 慢大约3倍std::vector,比memcpy原始缓冲区慢大约15倍.当我将实际应用程序切换到自定义缓冲时,这与前后分析一致.
这些都是内存缓冲区,因此iostream的缓慢不能归咎于缓慢的磁盘I/O,过多的刷新,与stdio的同步,或者人们用来解释C++标准库观察到的缓慢的任何其他事情iostream的.
很高兴看到其他系统上的基准测试和常见实现的评论(例如gcc的libc ++,Visual C++,Intel C++)以及标准规定了多少开销.
许多人都正确地指出,iostream更常用于格式化输出.但是,它们也是C++标准提供的二进制文件访问的唯一现代API.但是对内部缓冲进行性能测试的真正原因适用于典型的格式化I/O:如果iostreams无法保持磁盘控制器提供原始数据,那么当他们负责格式化时,他们怎么可能跟上呢?
所有这些都是outer(k)循环的每次迭代.
在ideone上(gcc-4.3.4,未知的操作系统和硬件):
ostringstream:53毫秒stringbuf:27毫秒vector<char>并且back_inserter:17.6毫秒vector<char> 与普通迭代器:10.6毫秒vector<char> 迭代器和边界检查:11.4 mschar[]:3.7毫秒在我的笔记本电脑上(Visual C++ 2010 x86,cl …
目前,我的代码就是这样:
void ReadFile(double Cst[][1000], char* FileName, int height)
FILE* ifp;
double value;
int nRead = 0;
int mRead = 0;
//open the file, check if successful
ifp = fopen( FileName, "r" );
if (ifp==NULL){
...
}
for (nRead = 0; nRead < height; nRead++){
for (mRead = 0; mRead < 1000; mRead++){
fscanf(ifp, "%le",&value);
Cst[nRead][mRead]=value;
}
}
fclose(ifp);
Run Code Online (Sandbox Code Playgroud)
我可以改变什么来使它尽可能快?
问题:非常非常大的文件我需要逐行解析以从每一行获得3个值.一切正常但解析整个文件需要很长时间.几秒钟内可以做到这一点吗?它的典型时间为1分钟至2分钟.
示例文件大小为148,208KB
我正在使用正则表达式解析每一行:
这是我的c#代码:
private static void ReadTheLines(int max, Responder rp, string inputFile)
{
List<int> rate = new List<int>();
double counter = 1;
try
{
using (var sr = new StreamReader(inputFile, Encoding.UTF8, true, 1024))
{
string line;
Console.WriteLine("Reading....");
while ((line = sr.ReadLine()) != null)
{
if (counter <= max)
{
counter++;
rate = rp.GetRateLine(line);
}
else if (max == 0)
{
counter++;
rate = rp.GetRateLine(line);
}
}
rp.GetRate(rate);
Console.ReadLine();
}
}
catch (Exception e)
{
Console.WriteLine("The file could not be …Run Code Online (Sandbox Code Playgroud) 我正在寻找使用C#如何为我的特定架构实现并发框架的想法:
我实现了几个模块/容器(实现为类),它们都是单独连接到消息总线的.每个模块主要产生或主要消耗,但所有模块还实现用于两个给定模块之间的通信的请求/应答模式.我对并发和异步编程非常陌生,但本质上希望以并发方式而不是同步方式运行整个架构.鉴于以下要求,我真的很感激为我的特定用例考虑哪些技术(TPL,ThreadPool,CTP,开源库,......)的指针:
鉴于我喜欢管理你建议我应该关注的并发实现?
编辑:我想强调,我面临的最大问题是如何方便地将每个容器/模块连接到线程/任务池,以便每个模块都运行异步,同时仍然提供这些模块之间的完全进出通信.在我没有解决将所有模块连接到可以处理动态涉及的任务/线程数量的并发平台之前,我并不太关心优化单个生产者/消费者模式.
c# concurrency multithreading asynchronous task-parallel-library
我读过C++ Streams和C风格的IO?(以及其他页面)试图帮助我决定在我正在进行的项目中实现某些文件IO的方法.
背景 我是C++和Windows编程的新手,我一直在C和命令行应用程序中工作.对这个问题的n00b提前道歉.
问题 我想读取一个文本文件,处理内容并输出到另一个(新)文本文件.我在Win32环境中工作(这对于可预见的未来不会改变)并且正在通过_T样式宏编写应用程序以识别Unicode."处理"可以包括插入/附加/删除文本行,最多128个字符.
这个问题 我更喜欢写一些强大的东西,因此I/O错误处理是一个考虑因素.我认为我需要远离C风格文件I/O,除非简化代码和类型检查没有其他原因 - 即在更多的OO POV中处理这个问题.使用Win32 API函数而不是C++流函数(如果有的话)有什么好处?你能为这两种方法推荐一个好的底漆吗?(我的谷歌搜索给我留下了一点信息超载)
非常感谢
我有一个格式为的txt文件:
0.32423 1.3453 3.23423
0.12332 3.1231 9.23432432
9.234324234 -1.23432 12.23432
...
Run Code Online (Sandbox Code Playgroud)
每行有三个双倍值.此文件中有超过10000行.我可以使用ReadStream.ReadLine并使用String.Split,然后转换它.我想知道有没有更快的方法来做到这一点.
最好的祝福,
c# ×3
c++ ×3
algorithm ×1
asynchronous ×1
concurrency ×1
file-io ×1
iostream ×1
performance ×1
regex ×1
winapi ×1