【问题标题】:Perl way to allocate some memory inglobal array [closed]Perl在全局数组中分配一些内存的方法[关闭]
【发布时间】:2022-01-09 09:41:06
【问题描述】:

如何最有效地在 Perl 全局数组中预分配一些内存?

首先数组最大为 40 - 41 KB,然后可能会超出它

一切都是为了高效的运行时间并避免许多重新分配费用

提前致谢

【问题讨论】:

  • 转帖到PerlMonks
  • 避免许多重新分配费用”——这在脚本语言中通常不是问题,因为效率低得多。但是,您可以通过设置数组$#name(最后一个元素的索引)来预分配数组@name。所以如果你说$#name = 99; 那么@name 被分配了一百个元素。然而,那些将要成为的元素,即标量,它们本身当然不能在时间之前分配,因此可能甚至无法检测到增益。尝试并衡量,这样您就可以放弃这个想法并担心重要的项目:)
  • 请演示一个小的独立代码示例,它将向我们展示您的应用程序的性能如何因不预分配而显着降低。例如,分析结果也会很有用。这将有助于为更好的答案建立上下文,并提供更细致入微的解决方案。
  • (在我上面的评论中:“那些元素,标量,”——实际的元素当然是指向标量的指针)

标签: arrays perl memory


【解决方案1】:

我假设您指的是操作系统对 Perl 进程的内存分配。通常内存分配是一个非常快速和有效的过程。所以这没什么好考虑的。

您的第二个大误解似乎在于 Perl 如何使用内存。它永远不会从操作系统释放和重新分配内存。 (例外:Windows 上的一些场景)

Perl 中的变量是动态分配的,因此它们会自动获取或释放 Perl 内存池中的空间Perl 认为合适。你甚至不应该考虑这个。它与 C 非常不同。没有语言级别的指针或缓冲区。

如果您遇到大量“分配”的情况,按照您的说法,您可能只需要一个更好的算法。

预分配任何东西的一种情况是,您将对变量或数据结构进行大量的小增量扩展。在这种情况下,您可以使用这些技巧。请记住,除非您的算法确实需要,否则不要这样做。内存管理是一个实现细节,因此在任何给定平台上都不能指望它。

# Force Perl to allocate some OS memory
{ local $_ = "\0" x 2**30; }

# Preallocate some buffer space for a string variable
my $x = "\0" x 2**20;
$x = "";
foreach (0 .. 2**19) {
  $x .= get_something();
}

# Pre-extend an array
my @x;
$#x = 2**20 - 1;


【讨论】:

  • Re "通常内存分配是一个非常快速和高效的过程。",并非如此。特别是在构建标量时可能涉及三个内存分配。但是 Perl 通过努力重新利用内存来弥补这一点。例如词法实际上并没有在范围退出时被释放。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-11-09
  • 1970-01-01
  • 1970-01-01
  • 2013-10-15
  • 2013-03-05
  • 1970-01-01
相关资源
最近更新 更多