当声明符(我/州)在for块中时会发生什么?

爪子

以下块运行循环,将主题分配给变量$var

  • 第一个my $var;在循环之外
  • 第二个my $var;在循环内
  • 最后state $var;是循环内
my $limit=10_000_000;
{
    my $var;
    for ^$limit { $var =$_; }
    say now  - ENTER now;
}
{
    for ^$limit { my $var; $var=$_; }
    say now  - ENTER now;
}
{
    for ^$limit { state $var; $var=$_; }
    say now  - ENTER now;
}

每个块的样本输出持续时间(秒)如下:

0.5938845                                                                                                                                 
1.8251226                                                                                                                                 
2.60700803  

https://docs.perl6.org/syntax/state运动state变量处的文档具有与相同的词法作用域my在功能上,代码块1和块3将在对相应循环块的多次调用中实现相同的持久存储。

为什么state(和内部my)版本需要更多时间?它还在做什么?

编辑:类似于@HåkonHægland的注释,如果我剪切并粘贴了上面的代码,以便每个块总共运行3次,则my $var外部循环的时序变化会很明显(第一种情况):

0.600303                                                                                                                                  
1.7917011                                                                                                                                 
2.6640811                                                                                                                                 

1.67793597                                                                                                                                
1.79197091                                                                                                                                
2.6816156                                                                                                                                 

1.795679                                                                                                                                  
1.81233942                                                                                                                                
2.77486777
乔纳森·沃辛顿

简短版本:在没有任何运行时优化(类型专门化,JIT等)的世界中,时间安排将符合您的期望。优化程序处理每个示例的效果会影响此处的时间安排。

首先,在没有任何运行时优化的情况下运行代码很有趣。在我当前使用的机器上(相当慢)的VM中,坚持MVM_SPESH_DISABLE=1使用环境会导致以下情况:

13.92366942
16.235372
14.4329288

这些具有某种直观意义:

  • 在第一种情况下,我们在块的外部范围中声明了一个简单的词法变量
  • 在第二种情况下,我们必须Scalar在循环中每次分配一个额外的分配,然后进行垃圾回收,这会占用额外的时间
  • 在第三种情况下,我们使用state变量。state变量存储在封闭件的代码对象,然后被复制到在输入时间的呼叫帧。这比Scalar每次分配一个新程序便宜,但是比根本不需要执行该操作要多得多的工作。

接下来,让我们运行3个启用了优化器的程序,每个示例都在其自己的隔离程序中。

  • 第一次出现0.86298831速度是的16倍。去优化器!它已内联循环主体。
  • 第二个出现在1.2288566速度提高13倍。也不要太破旧。它再次内联循环主体。(一旦逃逸分析器足够聪明以消除Scalar分配,这种情况在将来也将变得更加便宜。)
  • 第三个出现在2.0695035速度提高7倍。相对而言,这并不令人印象深刻(即使仍然是一个很大的改进),主要原因是它没有内联循环主体。为什么?因为它尚不知道如何内联使用状态变量的代码。(如何看待:MVM_SPESH_INLINE_LOG=1在环境中运行,输出结果为:Can NOT inline (1) with bytecode size 78 into (3): cannot inline code that declares a state variable。)

简而言之,这里的主要因素是循环主体的内联,并且具有状态变量,这是当前不可能的。

目前尚不清楚为什么优化器在外部声明$var何时不是程序中的第一个循环时会变得更糟感觉比“合理地优化此功能”的情况更像是一个错误。在稍有防御的情况下,即使它没有期望的那么大,它仍然始终能够取得巨大的进步!

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

当Final块中的代码引发异常时会发生什么?

来自分类Dev

当线程进入Java中的同步块/方法时会发生什么情况

来自分类Dev

当您重新声明angular中的现有指令时会发生什么?

来自分类Dev

将标头包含在静态声明中时会发生什么?

来自分类Dev

在JavaScript中声明带有几个empy元素的数组时会发生什么

来自分类Dev

当我们在Android Studio中添加DEPENDENCY时会发生什么

来自分类Dev

当我在Bash脚本中对函数使用`&`时会发生什么?

来自分类Dev

当我在异步回调中设置对象时会发生什么?

来自分类Dev

当我释放Delphi中可能不存在的内存时会发生什么?

来自分类Dev

当我在C ++中对未初始化的指针调用“删除”时会发生什么?

来自分类Dev

当我在代码中留下一些断点时会发生什么?

来自分类Dev

当我们在Collections.synchronizedMap()中传递哈希表时会发生什么

来自分类Dev

当我在SQL Server中删除列时会发生什么

来自分类Dev

当我在函数中重新分配可变默认参数时会发生什么?

来自分类Dev

当我将鼠标悬停在Chrome中的链接上时会发生什么?

来自分类Dev

当我从GUI中按下“关闭”时会发生什么?

来自分类Dev

当我输入perl并在终端中按Enter键时会发生什么?

来自分类Dev

当我在Android中实例化文件时会发生什么?

来自分类Dev

当我在子类中初始化UIView时会发生什么?

来自分类Dev

当我们在html标记中包含错误的属性时会发生什么?

来自分类Dev

当我在console.log中调用console.log时会发生什么?

来自分类Dev

当我在代码中留下一些断点时会发生什么?

来自分类Dev

当我们在同一类中创建类的实例时会发生什么?

来自分类Dev

当我在C ++中对类使用vector时会发生什么

来自分类Dev

当我在printf()中的字符串后添加带加号的int时会发生什么

来自分类Dev

新手Q-当我在printf中遗漏变量时会发生什么

来自分类Dev

当我在嵌套的 React 组件中调用作为 props 传递的函数时会发生什么?

来自分类Dev

暂停时会发生什么?

来自分类Dev

当我使用多个模拟时间时会发生什么?

Related 相关文章

  1. 1

    当Final块中的代码引发异常时会发生什么?

  2. 2

    当线程进入Java中的同步块/方法时会发生什么情况

  3. 3

    当您重新声明angular中的现有指令时会发生什么?

  4. 4

    将标头包含在静态声明中时会发生什么?

  5. 5

    在JavaScript中声明带有几个empy元素的数组时会发生什么

  6. 6

    当我们在Android Studio中添加DEPENDENCY时会发生什么

  7. 7

    当我在Bash脚本中对函数使用`&`时会发生什么?

  8. 8

    当我在异步回调中设置对象时会发生什么?

  9. 9

    当我释放Delphi中可能不存在的内存时会发生什么?

  10. 10

    当我在C ++中对未初始化的指针调用“删除”时会发生什么?

  11. 11

    当我在代码中留下一些断点时会发生什么?

  12. 12

    当我们在Collections.synchronizedMap()中传递哈希表时会发生什么

  13. 13

    当我在SQL Server中删除列时会发生什么

  14. 14

    当我在函数中重新分配可变默认参数时会发生什么?

  15. 15

    当我将鼠标悬停在Chrome中的链接上时会发生什么?

  16. 16

    当我从GUI中按下“关闭”时会发生什么?

  17. 17

    当我输入perl并在终端中按Enter键时会发生什么?

  18. 18

    当我在Android中实例化文件时会发生什么?

  19. 19

    当我在子类中初始化UIView时会发生什么?

  20. 20

    当我们在html标记中包含错误的属性时会发生什么?

  21. 21

    当我在console.log中调用console.log时会发生什么?

  22. 22

    当我在代码中留下一些断点时会发生什么?

  23. 23

    当我们在同一类中创建类的实例时会发生什么?

  24. 24

    当我在C ++中对类使用vector时会发生什么

  25. 25

    当我在printf()中的字符串后添加带加号的int时会发生什么

  26. 26

    新手Q-当我在printf中遗漏变量时会发生什么

  27. 27

    当我在嵌套的 React 组件中调用作为 props 传递的函数时会发生什么?

  28. 28

    暂停时会发生什么?

  29. 29

    当我使用多个模拟时间时会发生什么?

热门标签

归档