我有一个包含 1700 万个元素的 struct 动态分配数组。为了将它保存到磁盘,我写了
fwrite(StructList, sizeof(Struct), NumStructs, FilePointer)
在后面的步骤中,我使用等效的 fread 语句读取它,即使用 sizeof(Struct) 和 NumStructs 的计数.我预计生成的文件大约为 3.5 GB(这都是 x64)。
是否可以通过传递 sizeof(Struct) * NumStructs 作为大小和 1 作为计数来加快速度?我绞尽脑汁想知道为什么在具有 32 GB RAM(大量写入缓存)的快速计算机上写入操作可能需要 分钟。我已经运行了自制基准测试,缓存足够激进,前 800 MB 到 1 GB 的速度通常为 400 MB/秒。 PerfMon 显示它在 fwrite 期间消耗了一个内核的 100%。
我看到了问题here所以我要问的是,fwrite 中是否有一些循环可以通过告诉它写入大小为 n*s 的 1 个元素而不是大小为 n 的元素来“欺骗”以更快地运行。
编辑
我在 Release模式下运行了两次,两次我都放弃了等待。然后我在 Debug模式下运行它,因为我知道 fwrite 操作通常需要更长的时间。要写入的数据的确切大小为 4,368,892,928 字节。在所有这三种情况下,PerfMon 都显示两次突发的磁盘写入事件,间隔大约 30 秒,之后 CPU 达到一个内核的 100%。该文件此时为 73,924,608 字节。我在 fwrite 的两边都有断点,所以我知道它所在的位置。看起来肯定有什么东西卡住了,但我会让它运行一整夜看看。
编辑
把它放了一夜,它肯定卡在 fwrite 中,文件从未超过 70 MB。
最佳答案
这绝对是fwrite的问题(VS2012和2010我都试过了)
从一个标准的 C++ 项目开始,我只更改了设置以在静态链接中使用多字节字符集、x64 目标和标准库的多线程调试版本。
以下代码成功(为了简洁没有错误检查):
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
int main()
{
FILE *fp;
long long n;
unsigned char *data;
n = 4LL * 1024 * 1024 * 1024 - 1;
data = (unsigned char *)malloc(n * sizeof(unsigned char));
fp = fopen("T:\\test.bin", "wb");
fwrite(data, sizeof(unsigned char), n, fp);
fclose(fp);
}
在我机器上的调试版本中,程序在大约 1 分钟内完成(malloc 只需要几秒钟,所以这主要是 fwrite),平均消耗 30% 的 CPU。 PerfMon 显示写入完全发生在最后是一个 4 GB 的“闪存”(写入缓存)。
在 n 的赋值中将 - 1 更改为 + 1 并且您重现了问题:瞬时 100% CPU 使用率并且什么都没有写入。几分钟后,文件的大小仍然是 0 字节(回想一下我的实际代码,它设法转储了 70 MB 左右)。
这肯定是 fwrite 的问题,因为下面的代码可以很好地写入文件:
int main()
{
FILE *fp;
long long n;
long long counter = 0;
long long chunk;
unsigned char *data;
n = 4LL * 1024 * 1024 * 1024 + 1;
data = (unsigned char *)malloc(n * sizeof(unsigned char));
fp = fopen("T:\\test.bin", "wb");
while (counter < n)
{
chunk = min(n - counter, 100*1000);
fwrite(data+counter, sizeof(unsigned char), chunk, fp);
counter += chunk;
}
fclose(fp);
}
在我的机器上,这需要 45 秒而不是 1 分钟。 CPU 使用率不是恒定的,它是突发的,报告的 IO 写入比“单 block ”方法更分散。
如果速度的增加是错误的(也就是说,由于缓存),我会感到非常惊讶,因为我在编写包含所有相同数据的几个文件与包含随机数据的文件和报告的写入速度(与缓存)是一样的。所以我敢打赌,至少 fwrite 的这个实现不喜欢一次传递给它的大块。
我还测试了 fread 在 4 GB+1 的情况下关闭文件写入后立即读取并且它及时返回 - 最多几秒钟(这里没有真实数据所以我没有检查它)。
编辑
我使用 block 写入方法和 4 GB-1 文件的单个 fwrite 调用运行了一些测试(这两种方法都可以做到的最大大小)。多次运行程序(使用这样的代码打开文件,通过多次 fwrite 调用写入,关闭,然后再次打开,在一次调用中写入,然后关闭),毫无疑问, block 写入方法返回得更快。在最坏的情况下,它返回的时间是单次调用所需时间的 68%,而我最多只得到 20%。
关于c - fwrite() 性能远低于磁盘容量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21947743/
我正在使用Ruby解决一些ProjectEuler问题,特别是这里我要讨论的问题25(Fibonacci数列中包含1000位数字的第一项的索引是多少?)。起初,我使用的是Ruby2.2.3,我将问题编码为:number=3a=1b=2whileb.to_s.length但后来我发现2.4.2版本有一个名为digits的方法,这正是我需要的。我转换为代码:whileb.digits.length当我比较这两种方法时,digits慢得多。时间./025/problem025.rb0.13s用户0.02s系统80%cpu0.190总计./025/problem025.rb2.19s用户0.0
我正在寻找一个用ruby演示计时器的在线示例,并发现了下面的代码。它按预期工作,但这个简单的程序使用30Mo内存(如Windows任务管理器中所示)和太多CPU有意义吗?非常感谢deftime_blockstart_time=Time.nowThread.new{yield}Time.now-start_timeenddefrepeat_every(seconds)whiletruedotime_spent=time_block{yield}#Tohandle-vesleepinteravalsleep(seconds-time_spent)iftime_spent
如果用户是所有者,我有一个条件来检查说删除和文章。delete_articleifuser.owner?另一种方式是user.owner?&&delete_article选择它有什么好处还是它只是一种写作风格 最佳答案 性能不太可能成为该声明的问题。第一个要好得多-它更容易阅读。您future的自己和其他将开始编写代码的人会为此感谢您。 关于ruby-on-rails-如果条件与&&,是否有任何性能提升,我们在StackOverflow上找到一个类似的问题:
我编写了一个Ruby应用程序,它可以解析来自不同格式html、xml和csv文件的源中的大量数据。我如何找出代码的哪些区域花费的时间最长?有没有关于如何提高Ruby应用程序性能的好资源?或者您是否有任何始终遵循的性能编码标准?例如,你总是用加入你的字符串吗?output=String.newoutput或者你会使用output="#{part_one}#{part_two}\n" 最佳答案 好吧,有一些众所周知的做法,例如字符串连接比“#{value}”慢得多,但是为了找出您的脚本在哪里消耗了大部分时间或比所需时间更多,您需要进行分
LL库和HAL库简介LL:Low-Layer,底层库HAL:HardwareAbstractionLayer,硬件抽象层库LL库和hal库对比,很精简,这实际上是一个精简的库。LL库的配置选择如下:在STM32CUBEMX中,点击菜单的“ProjectManager”–>“AdvancedSettings”,在下面的界面中选择“AdvancedSettings”,然后在每个模块后面选择使用的库总结:1、如果使用的MCU是小容量的,那么STM32CubeLL将是最佳选择;2、如果结合可移植性和优化,使用STM32CubeHAL并使用特定的优化实现替换一些调用,可保持最大的可移植性。另外HAL和L
文章目录一基础定义二创建逻辑卷2-1准备物理设备2-2创建物理卷2-3创建卷组2-4创建逻辑卷2-5创建文件系统并挂载文件三扩展卷组和缩减卷组3-1准备物理设备3-2创建物理卷3-3扩展卷组3-4查看卷组的详细信息以验证3-5缩减卷组四扩展逻辑卷4-1检查卷组是否有可用的空间4-2扩展逻辑卷4-3扩展文件系统五删除逻辑卷5-1备份数据5-2卸载文件系统5-3删除逻辑卷5-4删除卷组5-5删除物理卷六LVM逻辑卷缩容6-1缩容注意事项6-2标准缩容步骤一基础定义LVM,LogicalVolumeManger,逻辑卷管理,Linux磁盘分区管理的一种机制,建立在硬盘和分区上的一个逻辑层,提高磁盘分
是否存在GC.disable会降低性能的情况?只要我使用的是真正的RAM而不是交换内存,就可以这样做吗?我正在使用MRIRuby2.0,据我所知,它是64位的,并且使用的是64位的Ubuntu:ruby2.0.0p0(2013-02-24revision39474)[x86_64-linux]Linux[redacted]3.2.0-43-generic#68-UbuntuSMPWedMay1503:33:33UTC2013x86_64x86_64x86_64GNU/Linux 最佳答案 GC.disable将禁用垃圾回收。像rub
我尝试在Internet上搜索有关使用angularJS进入RubyonRails项目与RubyonRailspure的View性能的信息。我的问题是因为2个月前我开始使用纯AngularJS,现在我需要将AngularJS集成到一个新项目中,但需要展示使用带有RubyonRails的AngularJS呈现View的性能如何,并消除对RubyonRails的负担.例如:带Rails的Angular:使用RubyonRails获取数据(从数据库或GET请求),将信息发送到file.js.erb并使用AngularJS操作数据并显示带有解析数据的View。纯粹的Rails:(自然流程)使用
我觉得我理解require和require_dependency之间的区别(来自Howarerequire,require_dependencyandconstantsreloadingrelatedinRails?)。但是,我想知道如果我使用一些不同的方法(参见http://hemju.com/2010/09/22/rails-3-quicktip-autoload-lib-directory-including-all-subdirectories/和Bestwaytoloadmodule/classfromlibfolderinRails3?)来加载所有文件会发生什么,所以我们:
设置一个临时变量来交换数组中的两个元素似乎比使用并行赋值更有效。谁能帮忙解释下?require"benchmark"Benchmark.bmdo|b|b.reportdo40000000.times{array[1],array[2]=array[2],array[1]}endendBenchmark.bmdo|b|b.reportdo40000000.timesdot=array[1]array[1]=array[2]array[2]=tendendend结果:usersystemtotalreal4.4700000.0200004.490000(4.510368)usersyste