- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在寻找改进我的算法来分配大量数据的谜语。如果有人能想到一些让它运行得更快的好主意,我将不胜感激。
我有 8 个文件包含 2 个参数:
1) 起点
2)终点
这些类型的数据在文件中以不同的数字重复出现。意味着我可以拥有一个包含 200 个起点 + 200 个终点的文件,或者一个包含 50000 个起点 + 50000 个终点的文件。
好的,这些数据可能性反射(reflect)了 X 轴数据点。每个点的开始/结束都会被排序到X_sort_array中。
问题始于 Y 轴数据点。
为了创建 Y 轴数据点,我使用了一些算法来运行整个 X_sort_array 点,并检查每个点是否位于所有起始结束点 individuality 之间。如果是为 Y_array[x_point] 加一等等...
我将在这里粘贴我的大部分代码,如果有一种语法/方法可以更有效地执行它,我很高兴知道。
当 sort_all_legth 大于 50000 时 - 慢动作开始:
my $sort_all_length = @{$values{"$tasks_name[$i]\_sort\_allvals"}};
my $core_count = 0;
my $m=0;
for my $k(0 .. $sort_all_length-1){
if (($values{"$tasks_name[$i]\_sort\_allvals"}->[$k] eq $values{"$tasks_name[$i]\_sort\_allvals"}->[$k-1])
& ($k != 0) ) {
}
else {
my $pre_point_flag;
# CHEACK PREVIUES POINT:
for my $inst_num(0 .. $sort_all_length/2-1){
$pre_point_flag=1;
if ( ($values{"TID$i\_$tasks_name[$i]\_SHL"}->[$inst_num] <= $values{"$tasks_name[$i]\_sort\_allvals"}->[$k]-1)
& ($values{"$tasks_name[$i]\_sort\_allvals"}->[$k]-1 <= $values{"TID$i\_$tasks_name[$i]\_EHL"}->[$inst_num]) ) {
$pre_point_flag=0;
last;
}
}
if ($pre_point_flag eq 1){
push(@{$values{"$tasks_name[$i]\_Y"}},0);
push(@{$values{"$tasks_name[$i]\_X"}},$values{"$tasks_name[$i]\_sort\_allvals"}->[$k]-1);
}
# CHEACK DEFINE POINT:
for my $inst_num(0 .. $sort_all_length/2-1){
if ( ($values{"TID$i\_$tasks_name[$i]\_SHL"}->[$inst_num] <= $values{"$tasks_name[$i]\_sort\_allvals"}->[$k])
& ($values{"$tasks_name[$i]\_sort\_allvals"}->[$k] <= $values{"TID$i\_$tasks_name[$i]\_EHL"}->[$inst_num]) ) {
$core_count++;
}
}
push(@{$values{"$tasks_name[$i]\_Y"}},$core_count);
push(@{$values{"$tasks_name[$i]\_X"}},$values{"$tasks_name[$i]\_sort\_allvals"}->[$k]);
# CHEACK LATER POINT:
for my $inst_num(0 .. $sort_all_length/2-1){
$pre_point_flag=1;
if ( ($values{"TID$i\_$tasks_name[$i]\_SHL"}->[$inst_num] <= $values{"$tasks_name[$i]\_sort\_allvals"}->[$k]+1)
& ($values{"$tasks_name[$i]\_sort\_allvals"}->[$k]+1 <= $values{"TID$i\_$tasks_name[$i]\_EHL"}->[$inst_num]) ) {
$pre_point_flag=0;
last;
}
}
if ($pre_point_flag eq 1){
push(@{$values{"$tasks_name[$i]\_Y"}},0);
push(@{$values{"$tasks_name[$i]\_X"}},$values{"$tasks_name[$i]\_sort\_allvals"}->[$k]+1);
}
if ($y_max_val < $core_count){
$y_max_val = $core_count;
}
$core_count = 0;
$m++;
}
}
具有良好性能的小数据示例:
(IP 大小为 50000 时性能较差!)
database: task: byte_position
database: binary file size: 3216
database: numbers of start/end values = 804
database: counting active cores in sorted I.P array (size: 1608)...
database: I.P array value:
375127997,375135023,375177121,375177978,375225484,375226331, 375273745,375274563,375320063,375325255,375372479,375377085, 375422115,375422896,375473198,375474058,375517412,375518169, 375561967,375562760,375606301,375607092...
测试示例输入/输出:
输入是 X 轴上的起点和终点:
16,255
16,255
16,255
100,355
200,455
database: task: TEST
database: binary file size: 20
database: numbers of start/end values = 5
database: sorted I.P array (X axis):
16,16,16,100,200,255,255,255,355,455
这些点中的每一个都称为有趣点(在 X 轴上)。
为了计算 Y 值,我用每个 I.P 画一条垂直线
然后我计算有多少输入线(起点/终点)穿过第一条垂直线。
结果是第一个 X I.P 的第一个 Y 点
database: counting active cores in sorted I.P array (size: 10)...
输出向量:
database: sorted cores array (Y axis):
0,3,4,5,5,2,1,0
在我的算法中,我在每个开始/结束 block 的 IP 之前和之后添加了另一个点。
这样你就可以在开头/结尾看到零!
3 - 表示 X 点 16 处有 3 条切片线
4 - 表示在 X 点 100 处有 4 条切片线
5 - (1)表示在X点200处有5条切片线
5 - (2)表示在X点255处有5条切片线
2 - 表示在 X 点 355 处有 2 条切片线
1 - 表示在 X 点 455 处有 1 条切片线
希望这些扩展示例能让您更好地理解算法。 :)
我将重建代码以提高可读性。
谢谢,尤达。
最佳答案
提高绩效的一个非常简单的方法就是学习更好的编码实践。
您忽略的一个原则是:不要重复自己。
您多次重复其中的某些代码,迫使 Perl 一次又一次地计算相同的表达式。此字符串的一个示例是:
"$tasks_name[$i]\_sort\_allvals"
它在那里被使用了大约10次。这意味着每次使用它时,perl 都会引用该数组(以防它发生更改)并将该字符串组合在一起。看起来可能不多,但最终会增加。
另一个例子是这样的:
$values{"$tasks_name[$i]\_sort\_allvals"}->[$k]
它也使用了 10 次,虽然 $k 实际上改变了每个循环,但对于每次循环运行,整个表达式的值是相同的。在循环开始时将其存储在单个标量中,然后在其余部分中使用该标量会更快,因为您可以避免强制 Perl 每个循环解析引用 10 次。
关于performance - 如何提高Perl处理海量数据的性能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2019298/
如果我的 Perl 程序使用 Perl 模块,它将如何确定在哪里可以找到包含模块代码的文件? 例如,如果程序包含: use MyModule1; # Example 1 us
我在一个文件中有一些不同格式的数字:8.3、0.001、9e-18。我正在寻找一种简单的方法来读取它们并存储它们而不会损失任何精度。这在 AWK 中很容易,但在 Perl 中是如何完成的呢?我只愿意使
我在一个文件中有一些不同格式的数字:8.3、0.001、9e-18。我正在寻找一种简单的方法来读取它们并存储它们而不会损失任何精度。这在 AWK 中很容易,但在 Perl 中是如何完成的呢?我只愿意使
我正在自学 Perl,并且在我的 Windows 8 64 位系统上安装了 Strawberry。 Strawberry 命令行似乎工作正常,我在 C 驱动器上的 Strawberry 文件夹中创建了
我在 Perl 模块 IO::Socket::SSL 中发现了一个错误,我可能会修复它,但是,我担心测试修复。我从 Debian 下载了源码包(因为我打算为它制作一个 Debian 包或补丁)并查看了
我有一个 perl 文件,它使用了两个 perl 模块 A.pm 和 B.pm。 但是在 B.pm 中我需要调用 A.pm 的子程序。即使我在 A.pm 中使用并尝试使用它,我仍然遇到未定义的错误。
有没有办法在 Perl 运行时加载整个模块?我原以为我用 autouse 找到了一个很好的解决方案,但以下代码无法编译: package tryAutouse2; use autouse 'tryAu
过去,我编写过许多 perl 模块,以及不止一些独立的 perl 程序,但我之前从未发布过多文件 perl 程序。 我有一个几乎处于 beta 阶段的 perl 程序,它将被开源发布。它需要一些数据文
我有 1 个 perl 脚本,我们在其中编写了几个子例程。例子: # Try_1.pl main(); sub main{ --- --- check(); } check { -- --} 现在,
似乎 CPAN 上的一些(很多?)模块部分是使用 XS 在 C 中实现的,如果需要,可以回退到纯 perl 实现。虽然这很聪明,但它显然会损害性能,我想知道它是否会发生,以便我可以解决问题。 有没有一
我对 perl 很陌生。我希望我可以从 perl 安装一些软件包,我这样做是这样的: perl -MCPAN -e 'install VM::EC2' 我猜它由于依赖而失败,它显示: Result:
给定一个 Perl 包 Foo.pm,例如 package Foo; use strict; sub bar { # some code here } sub baz { # more
我有一个用 Perl 编写的测试生成器。它生成连接到模拟器的测试。这些测试本身是用 Perl 编写的,并通过其 API 连接到模拟器。我希望生成的代码是人类可读的,这意味着我希望它能够正确缩进和格式化
我正在学习 Perl,非常新的用户。我可以知道这些 Perl 代码之间有什么区别吗? #!/usr/bin/perl & #!/usr/bin/perl -w 最佳答案 那不是 perl 代码,它是
我不认为这是一个重复的问题。这专门针对 Perl 模块附带的脚本。 通常,在安装多个 Perl 版本时,您可以将 perl 可执行文件标记为版本号 (perl5.32),这样它们就可以在 /whate
我有一个在文件中使用 Blowfish 加密的程序和第二个 perl 程序,它提示输入用于将其解密为字符串的密码,我希望不必将解密的源代码写入硬盘驱动器,尽管将它放在内存中并不是真正的问题,因为运行程
有没有人为 Perl 中的惰性求值列表找到了一个好的解决方案?我尝试了很多方法来改变类似的东西 for my $item ( map { ... } @list ) { } 进入懒惰的评估——例如,通
我安装了多个版本的 Perl。 我已经指定了要使用的版本。但是为了验证,我想从 .pl 脚本本身输出 Perl 的版本。 这可能吗? 在 Perl 脚本中解析“perl --version”的输出似乎
人们还经常问“我怎样才能编译 Perl?”而他们真正想要的是创建一个可以在机器上运行的可执行文件,即使他们没有安装 Perl。 我知道有几种解决方案: perl2exe靛蓝之星 它是商业的。我从未尝试
关闭。这个问题是opinion-based .它目前不接受答案。 想改进这个问题?更新问题,以便 editing this post 可以用事实和引用来回答它. 8年前关闭。 Improve this
我是一名优秀的程序员,十分优秀!