嗨,对于基本的负载测试,我已经准备了一个下面的Perl代码,我正在将10000个文件推送到我的系统中。但是,我无法在我想要的地方获得性能。就像我说的,我不在乎它是否使用100%的CPU。我的目标是在1秒内推送10000文件。在Perl中有没有更好的方法来编写这个脚本(在线程或并行的帮助下)。
#!/usr/bin/perl
my $directory= "/home/Documents/File";
chdir $directory;
opendir(DIR, ".") or die "couldn't open $directory: $!\n";
foreach my $file (readdir DIR){
my $cmd = "ft -MI -NMM -P 500 -f $file -d.";
system ( "cat","$cmd");
close $in_fh;
}
close DIR;
答案 0 :(得分:3)
你是在误解下操作的。并行代码的作用是允许您同时使用多个CPU。这意味着对于CPU密集型工作负载,您可以获得性能提升 - 任务解耦越多,扩展性越好。
但是您的任务是读取文件系统。看起来你没有做任何比目录遍历和阅读更复杂的事情。
这样做的限制因素几乎肯定是你的磁盘子系统,因此并行性对你没有任何帮助。实际上,它可能会使事情变得更糟 - 因为大多数磁盘控制器都可以检测顺序访问模式和预取,但如果你通过并行化伪随机化......它不能有效地进行伪随机化。
所以 - 简短的回答是不要打扰,因为你不会获得太多。
您可能需要考虑不进行系统调用以运行cat
,并且只需使用perl的open
即可加速 little 位。大概。
您还应始终use strict;
和use warnings;
- 特别是在发布到Stack Overflow之前 - 因为它们会帮助您发现一些更明显的错误案例。
例如:
Global symbol "$in_fh" requires explicit package name at file.pl line 10.
在思考关于并行性之前,您需要解决基本错误。并行代码非常酷,但如果你的代码首先是伪劣的,那么调试它也是一个可怕的噩梦。