相关疑难解决方法(0)

C++标准是否要求iostream的性能不佳,或者我只是处理糟糕的实现?

每当我提到C++标准库iostream的慢性能时,我都会遇到一阵难以置信的风潮.然而,我有剖析器结果显示在iostream库代码中花费了大量时间(完全编译器优化),并且从iostream切换到特定于操作系统的I/O API和自定义缓冲区管理确实提供了一个数量级的改进.

C++标准库做了多少额外工作,标准是否需要它,它在实践中是否有用?或者有些编译器提供了与手动缓冲区管理竞争的iostream实现吗?

基准

为了解决问题,我编写了几个简短的程序来练习iostreams内部缓冲:

请注意,ostringstreamstringbuf版本运行的迭代次数较少,因为它们的速度要慢得多.

在ideone上,它ostringstreamstd: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 ms
  • char[]:3.7毫秒

在我的笔记本电脑上(Visual C++ 2010 x86,cl …

c++ performance iostream

193
推荐指数
3
解决办法
2万
查看次数

在C++中从文本文件中读取数值的最快方法(在这种情况下为double)

目前,我的代码就是这样:

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)

我可以改变什么来使它尽可能快?

c++

15
推荐指数
4
解决办法
1万
查看次数

有一种快速的方法来解析带有正则表达式的大文件吗?

问题:非常非常大的文件我需要逐行解析以从每一行获得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# regex algorithm

10
推荐指数
2
解决办法
1万
查看次数

单机上低延迟,高吞吐量数据传输的最佳并发框架

我正在寻找使用C#如何为我的特定架构实现并发框架的想法:

我实现了几个模块/容器(实现为类),它们都是单独连接到消息总线的.每个模块主要产生或主要消耗,但所有模块还实现用于两个给定模块之间的通信的请求/应答模式.我对并发和异步编程非常陌生,但本质上希望以并发方式而不是同步方式运行整个架构.鉴于以下要求,我真的很感激为我的特定用例考虑哪些技术(TPL,ThreadPool,CTP,开源库,......)的指针:

  • 整个系统只能在本地机器上运行(进程内,甚至是消息总线)
  • 至少有一个模块执行大量IO(每秒从物理驱动器读取数百万个16byte消息),在整个时间内将多个16字节块发布到阻塞集合.
  • 另一个模块在整个时间内从阻塞集合中消耗.
  • 入口点是生产者开始发布消息,当生产者完成发布有限的16byte消息集时退出.
  • 绕过消息总线的唯一通信是出于吞吐量和延迟原因而向阻塞集合发布/消费.(很高兴听到建议摆脱消息总线,如果它是合理的)
  • 其他模块处理诸如写入SQL数据库,发布到GUI服务器,连接到与外部服务器通信的API等操作.这些操作运行频率较低/受限制,可能作为任务运行,而不是在运行整个线程时使用整个线程.系统.
  • 我使用的是64位四核16GB内存机器,但理想情况下我想实现一个也可以在双核心机器上运行的解决方案.

鉴于我喜欢管理你建议我应该关注的并发实现?

编辑:我想强调,我面临的最大问题是如何方便地将每个容器/模块连接到线程/任务池,以便每个模块都运行异步,同时仍然提供这些模块之间的完全进出通信.在我没有解决将所有模块连接到可以处理动态涉及的任务/线程数量的并发平台之前,我并不太关心优化单个生产者/消费者模式.

c# concurrency multithreading asynchronous task-parallel-library

7
推荐指数
1
解决办法
4391
查看次数

C风格,C++流或Win32 API文件I/O?

我读过C++ Streams和C风格的IO?(以及其他页面)试图帮助我决定在我正在进行的项目中实现某些文件IO的方法.

背景 我是C++和Windows编程的新手,我一直在C和命令行应用程序中工作.对这个问题的n00b提前道歉.

问题 我想读取一个文本文件,处理内容并输出到另一个(新)文本文件.我在Win32环境中工作(这对于可预见的未来不会改变)并且正在通过_T样式宏编写应用程序以识别Unicode."处理"可以包括插入/附加/删除文本行,最多128个字符.

这个问题 我更喜欢写一些强大的东西,因此I/O错误处理是一个考虑因素.我认为我需要远离C风格文件I/O,除非简化代码和类型检查没有其他原因 - 即在更多的OO POV中处理这个问题.使用Win32 API函数而不是C++流函数(如果有的话)有什么好处?你能为这两种方法推荐一个好的底漆吗?(我的谷歌搜索给我留下了一点信息超载)

非常感谢

c++ file-io winapi

5
推荐指数
3
解决办法
4024
查看次数

从文件C#中读取double值

我有一个格式为的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#

1
推荐指数
1
解决办法
8989
查看次数