相关疑难解决方法(0)

什么是C++中高性能顺序文件I/O的最快方法?

假设以下内容...
输出:
文件打开...
数据"流式传输"到磁盘.内存中的数据位于一个大的连续缓冲区中.它直接从该缓冲区以原始格式写入磁盘.缓冲区的大小是可配置的,但在流的持续时间内是固定的.缓冲区一个接一个地写入文件.没有进行任何搜寻行动.
...文件已关闭.

输入:
从头到尾从磁盘读取一个大文件(按上面顺序写入).


是否有通用的指南来实现C++中最快的顺序文件I/O?

一些可能的考虑:

  • 选择最佳缓冲区大小的指南
  • 像boost :: asio这样的可移植库是否会过于抽象而无法暴露特定平台的复杂性,或者它们可以被认为是最优的?
  • 异步I/O总是优于同步吗?如果应用程序不受CPU限制怎么办?

我意识到这将有特定于平台的考虑因素.我欢迎一般准则以及特定平台的准则.
(我对Win x64最直接的兴趣,但我也对Solaris和Linux上的评论感兴趣)

c++ performance file-io

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

如何调度/创建用户级线程,以及如何创建内核级线程?

如果这个问题很愚蠢,请道歉.我试图在网上找到答案很长一段时间,但不能,因此我在这里问.我学习线程,我一直在经历这个环节这个Linux的管道工会议2013视频有关内核级和用户级线程,而据我了解,使用并行线程创建线程在用户空间,内核是不知道关于这一点,并将其视为一个单独的进程,不知道内部有多少线程.在这种情况下,

  • 谁决定在进程的时间片期间调度这些用户线程,因为内核将其视为单个进程并且不知道线程,以及如何完成调度?
  • 如果pthreads创建用户级线程,如果需要,如何从用户空间程序创建内核级或OS线程?
  • 根据上面的链接,它说操作系统内核提供系统调用来创建和管理线程.那么clone()系统调用是否会创建内核级线程或用户级线程?
    • 如果它创建了一个内核级线程,那么strace一个简单的pthreads程序也会在执行时显示使用clone(),但是为什么它会被视为用户级线程呢?
    • 如果它没有创建内核级线程,那么如何从用户空间程序创建内核线程?
  • 根据链接,它说"它需要每个线程的完整线程控制块(TCB)来维护有关线程的信息.因此会产生大量开销并增加内核复杂性."所以在内核级线程中,只有堆是共享的,其余的都是线程的个体?

编辑:

我问的是用户级线程创建和它的调度,因为 这里有一个对多对一模型的引用,其中许多用户级线程被映射到一个内核级线程,并且线程管理在用户空间中由线程库.我一直只看到使用pthreads的引用,但不确定它是否创建了用户级或内核级线程.

c c++ linux multithreading linux-kernel

26
推荐指数
2
解决办法
4241
查看次数

以最有效的方式逐行读取*平台特定*

我正在寻找一种最有效的方式来阅读文本文件.

考虑到所有可能的优势,例如:

代码将是平台特定的Windows操作系统

并且我正在为当前的CPU等编写一个特定的事实.

*不介意它不是多平台.

只是简单的性能问题

我怎么能以最快的方式编码,将文本文件的每一行读入结构?

说结构是:

typdef struct _FileL{
 uint lidx;
 char* lncontent;
} FileL;
Run Code Online (Sandbox Code Playgroud)

我想的是:

传递FileL上面的动态数组和文件的路径什么是最有效的方式来填充和返回给定文件的行集合?

getFileLines(char* fullPath, FileL** fileLines){
    uint linesCount = 0;// total lines
    uint curLnIndex = 0;// lines counter

    FILE* srcFL; // will hold the source file using passed fullPath

    // now read file into memory 
    //that is the only way i could think of 
    //to be able to assign lineCount used to calculate the array length
    //and also the fastest way …
Run Code Online (Sandbox Code Playgroud)

c algorithm performance file

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

内核 RAM 外部 /dev/mem 上的 Memcpy 性能

我正在使用带有定制 Linux 的 SoC。我通过指定内核启动参数 mem=512M 保留了 1GB 总 RAM 的上 512MB。我可以通过打开 /dev/mem 并 mmap 内核未使用的上部 512MB 来从用户空间程序访问上部内存。我知道我想通过 memcpy() 复制该区域内的大块内存,但性能约为 50MB/sek。当我通过内核和 memcpy 在缓冲区之间分配缓冲区时,我可以达到大约 500MB/sek。我很确定这是由于我的特殊内存区域禁用了缓存,但不知道如何告诉内核在这里使用缓存。

有人知道如何解决这个问题吗?

c linux mmap memcpy

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

哪些段受写时复制的影响?

我对复制的理解是"每个人都有一个共享的相同数据副本,直到它被写入,然后复制".

  1. 是由堆和bss段组成的相同数据的共享副本还是仅包含堆?
  2. 哪些内存段将被共享,这取决于操作系统?

linux operating-system memory-management copy-on-write

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

Malloc使用的内存是所需内存的10倍

我有一个网络应用程序,它将可预测的65k块分配为IO子系统的一部分。内存使用情况是在系统内自动跟踪的,因此我知道我实际使用了多少内存。也可以根据malloc_stats()检查此数字

的结果 malloc_stats()

Arena 0:
system bytes     =    1617920
in use bytes     =    1007840
Arena 1:
system bytes     = 2391826432
in use bytes     =  247265696
Arena 2:
system bytes     = 2696175616
in use bytes     =  279997648
Arena 3:
system bytes     =    6180864
in use bytes     =    6113920
Arena 4:
system bytes     =   16199680
in use bytes     =     699552
Arena 5:
system bytes     =   22151168
in use bytes     =     899440
Arena 6:
system bytes     =    8765440
in use bytes     =     910736 …
Run Code Online (Sandbox Code Playgroud)

c memory memory-management

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

覆盖`istream operator >>`vs使用`sscanf`

说我想初始化一些std::vector对象,例如

class Person { int ID; string name; ...}

从包含每个对象的行的文件.一条路线,就是覆盖operator>>而简单地说std::cin>>temp_person,另一条路线- 我曾经赞成的是使用sscanf("%...", &...)一堆临时原始类型而且简单.emplace_back(Person(temp_primitives...).

哪种方式可以实现最快的运行时忽略内存占用?mmap()整个文件中有什么意义吗?

c++ scanf istream

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