为什么 substr-lvalue 比四参数 substr 更快?

2023-12-29

From 这个问题 https://stackoverflow.com/questions/61668990/is-it-faster-to-prepend-to-a-string-with-substr/61668991?noredirect=1#comment109085412_61668991,我们对这两个变体进行基准测试,

substr( $foo, 0, 0 ) = "Hello ";
substr( $foo, 0, 0, "Hello " );

在其中我们发现substr-左值为faster。池上对此说道:

4-arg substr 怎么比左值 substr 慢(它必须创建一个神奇的标量,并且需要额外的操作)??? –ikegami https://stackoverflow.com/users/589924/ikegami

说实话,我还认为它会慢很多,只是提到它,因为它是由其他人提出的。纯粹出于好奇,

Why is substr-lvalue 比四个参数更快substr在上面的用例中?


这只是一个糟糕的基准结果。

当我复制你的结果时,我在 Linux 的 Windows 子系统上的 Ubuntu 上使用了 perl。我们只能说性能对该系统的外部因素很敏感。

即使在同一台计算机上使用 Windows 的本机构建(Strawberry Perl),我也会得到结果的巨大差异:

                   Rate        substr substr_valute   multiconcat
                  Rate substr_valute        substr   multiconcat
substr_valute 6997958/s            --           -0%          -27%
substr        7007667/s            0%            --          -26%
multiconcat   9533733/s           36%           36%            --

                   Rate        substr substr_valute   multiconcat
substr        6795650/s            --           -0%          -10%
substr_valute 6805545/s            0%            --          -10%
multiconcat   7526593/s           11%           11%            --

                    Rate        substr substr_valute   multiconcat
substr         7513339/s            --          -22%          -28%
substr_valute  9693997/s           29%            --           -6%
multiconcat   10367639/s           38%            7%            --

                    Rate        substr   multiconcat substr_valute
substr         8791152/s            --          -13%          -14%
multiconcat   10139954/s           15%            --           -1%
substr_valute 10240638/s           16%            1%            --

时间太短了,机器太忙而无法获得准确的读数。

(在某个地方有一个关于微观优化的要点......)

我讨厌在我的共享 Linux Web 主机上运行基准测试,但它通常会产生更加一致的结果。今天也不例外。

                   Rate        substr substr_valute   multiconcat
substr        4293130/s            --           -3%          -13%
substr_valute 4407446/s            3%            --          -11%
multiconcat   4938717/s           15%           12%            --

                   Rate substr_valute        substr   multiconcat
substr_valute 4289732/s            --           -2%          -16%
substr        4356113/s            2%            --          -15%
multiconcat   5096889/s           19%           17%            --

(I used -3代替100_000_000.)

所有差异均为 3% 或更少,并不显着。据我所知,其中一个并不比另一个慢。

事实上,人们不应该期望有任何差异。正如戴夫·米切尔所指出的,substr( $foo, 0, 0 ) = "Hello ";被优化成几乎等同于substr( $foo, 0, 0, "Hello " );自 5.16 起(在 5.20 中有所改进)。

$ perl -MO=Concise,-exec -e'substr( $foo, 0, 0, "Hello " );'
1  <0> enter
2  <;> nextstate(main 1 -e:1) v:{
3  <#> gvsv[*foo] s
4  <$> const[IV 0] s
5  <$> const[IV 0] s
6  <$> const[PV "Hello "] s
7  <@> substr[t2] vK/4
8  <@> leave[1 ref] vKP/REFC
-e syntax OK

$ perl -MO=Concise,-exec -e'substr( $foo, 0, 0 ) = "Hello ";'
1  <0> enter
2  <;> nextstate(main 1 -e:1) v:{
3  <$> const[PV "Hello "] s
4  <#> gvsv[*foo] s
5  <$> const[IV 0] s
6  <$> const[IV 0] s
7  <@> substr[t2] vKS/REPL1ST,3
8  <@> leave[1 ref] vKP/REFC
-e syntax OK

(唯一的区别是操作数传递的顺序,这是使用REPL1ST flag.)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 substr-lvalue 比四参数 substr 更快? 的相关文章

  • 如何伪造 Perl 钻石运算符的输入?

    这个问题的答案 https stackoverflow com questions 1213986 how can i fake stdin in perl描述如何伪造输入
  • php 字符串末尾的 Substr?

    我有这种数组 我会让它变得非常简单易懂 picture artist2 1 thumb jpg artist2 2 jpg artist2 3 thumb jpg artist2 4 jpg artist2 5 thumb jpg 现在我想
  • 使用 perl 包时将参数传递给它

    如何在使用包时传递一些参数 例如 use Test More tests gt 21 我无法找到有关此功能的任何有价值的文档 通过这样的论点有什么优点和缺点吗 use My Module LIST https metacpan org po
  • Perl 脚本中的大小写敏感性 - 如何使其不敏感?

    我如何更改以下马尔可夫脚本以将大写和小写单词视为相同 整个想法是帮助提高马尔可夫文本生成器的输出质量 就目前情况而言 如果您在其中插入 99 个小写句子和 1 个大写句子 您几乎总是会在输出中找到大写句子的非标记化版本 Copyright
  • Perl IPC::Run3:如何为子进程模拟标准输入的 pty?

    这是一个后续问题IPC Open3 并确定子进程是否正在等待输入 https stackoverflow com questions 41454627 ipcopen3 and determining if child is waiting
  • 从 Perl“内存不足”错误获取堆栈跟踪

    tl dr 当 Perl httpd 进程内存不足时如何转储 Perl 堆栈跟踪 我们有一台 mod perl 2 服务器 Perl 5 8 8 RHEL 5 6 Linux 2 6 18 非常偶然且不可预测的情况是 子 httpd 进程开
  • Perl DBI fetchall_hashref

    考虑下表 mysql gt select from vCountryStatus CountryName CountryISO Code Status Symbol CurrencyName Brazil BR 55 LIVE BRL Br
  • if 语句在循环内部还是外部?

    如果我这样做会更好吗 foreach my item array if bool code else code or if bool foreach my item array else foreach my item array 我会离开
  • 我可以在 DBIx::Class 中漂亮地打印 DBIC_TRACE 输出吗?

    将 DBIC TRACE 环境变量设置为 true BEGIN ENV DBIC TRACE 1 生成非常有用的输出 特别是显示正在执行的 SQL 查询 但 SQL 查询全部在一行中 有没有办法将它推入某种 sql tidy 例程以更好地格
  • 如何在 Komodo IDE 中设置断点?

    我已经安装了科莫多集成开发环境 https www activestate com products komodo ide 我想知道在哪里 如何设置断点 以便顶行的第 9 个符号 gt 明白了吗 EDIT 单击代码左侧装订线中的行号
  • 在perl中串行处理XML数据

    我想知道在我的情况下 哪种 XML 解析器最适合 Perl 我读了很多书并尝试过XML LibXML and XML SAX 第一个使用了太多内存 第二个对我来说似乎没有那么快 即使在关闭纯 Perl 解析器之后 我的需求相当具体 我通过以
  • 符合 Y2K 意味着什么?

    我正在阅读 Perl 编程语言基础知识 我遇到了以下语句 Perl is Y2K compliant 即使在谷歌搜索之后也不太明白它的意思 是否建立了某种标准 如果是的话 那么是谁做的呢 任何信息表示赞赏 对于 20 世纪 90 年代末从事
  • 如何从一个 CGI 重定向到另一个 CGI

    我正在发送数据A cgi to B cgi B cgi更新数据库中的数据并应该重定向回A cgi 此时A cgi应该显示更新的数据 我添加了以下代码B cgi在数据库更新后立即进行重定向 url http Travel cgi bin A
  • perl `require` 对于变量给定的文件

    我想使用一个模块 文件的路径将位于变量中 我尝试使用这段代码 usr bin perl w use strict use Getopt Long my library zipped aid class file GetOptions aid
  • 生成的 pdf 中的图像损坏了发送到服务器的 pdf

    我正在使用 jsPDF 在 Web 应用程序中创建 PDF 文档 将该文档发送到 Perl 并让 Perl 通过电子邮件发送它 效果很好 但是 当我将图像添加到 PDF 文档时 它不再起作用 因为 Adob e Reader 说该文件已损坏
  • Perl:安全评估?

    我很好奇是否有任何有关执行受限评估的好信息 查看文档 有一个use Safe有一个reval方法 但我不确定这有多安全 我想要做的是能够将各种条件语句作为字符串传递给函数 而无需滥用 eval 的源 例如 sub foo my stmt s
  • 如何使用 Perl 检查文件的扩展名?

    对于我的 Perl 脚本 一个文件作为参数传递 该文件可以是 txt文件或一个 zip文件包含 txt file 我想编写看起来像这样的代码 if file is a zip unzip file file s zip txt 检查扩展的一
  • 我应该如何使用 Mojo::UserAgent 处理 HTML META 标记?

    我必须处理一些配置错误的 Web 服务器 因此我开始处理 HTML 元标记以将信息反馈到 Web 用户代理对象中 我尝试了多种方法来做到这一点莫乔利西斯 http mojolicio us并决定在响应中寻找 完成 事件 我的目标是让其余代码
  • 可以在子例程中使用模块吗?

    最近 我开始使用 OO Perl 并且为我正在开发的新项目创建了很多新对象 因为我不熟悉有关 OO Perl 的任何最佳实践 所以我们很急于完成它 P 我将大量此类代码放入每个函数中 sub funcx use ObjectX i don
  • 为什么 perl2exe 抱怨“无法解析的符号:Perl_Gthr_key_ptr”?

    在 Perl 中 这个错误是什么意思 Unresolved symbol Perl Gthr key ptr 我在 HP UX PA RISC 计算机上使用 perl2exe 将 Perl 文件转换为二进制文件时遇到此错误 usr lib

随机推荐