- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我刚刚编写了一个程序,在循环内调用 subst
以及许多其他函数,到目前为止,subst
函数调用占用的时间最多时间。下面是一段概念性的代码片段,其中包含了我编写的程序的精髓。
(loop
with bindings = ((symbol1 . 1) (sybmol2 . 2) ... (sybmoln . n))
with x-copy
for x in xs
do
...
(setq x-copy (copy-cpd x))
(setf (cpd-identifiers1 x-copy) (subst-bindings bindings (cpd-identifiers1 x)))
(setf (cpd-identifiers2 x-copy) (subst-bindings bindings (cpd-identifiers2 x)))
...)
subst-bindings
在内部递归调用 subst
:
(defun subst-bindings (bindings generic)
(cond ((null bindings) generic)
(t (subst-bindings (cdr bindings)
(subst (cdar bindings) (caar bindings) generic)))))
我在启用统计分析器的情况下运行了实际代码,得到了以下结果:
Self Total Cumul
Nr Count % Count % Count % Calls Function
------------------------------------------------------------------------
1 4585 45.8 6840 68.4 4585 45.8 - (LABELS SB-IMPL::S :IN SUBST)
2 2204 22.0 2205 22.1 6789 67.9 - EQL
3 489 4.9 489 4.9 7278 72.8 - SUBST
4 315 3.2 7537 75.4 7593 75.9 - SUBST-BINDINGS
5 150 1.5 235 2.3 7743 77.4 - PPRINT-DISPATCH
6 143 1.4 274 2.7 7886 78.9 - SB-IMPL::%FIND-SYMBOL
7 114 1.1 114 1.1 8000 80.0 - SB-IMPL::%MAKE-STRING-OUTPUT-STREAM
8 106 1.1 347 3.5 8106 81.1 - SB-KERNEL:OUTPUT-SYMBOL-NAME
9 94 0.9 113 1.1 8200 82.0 - SB-IMPL::STRING-SOUT
10 73 0.7 155 1.5 8273 82.7 - SB-KERNEL::VALUES-SPECIFIER-TYPE-R
11 70 0.7 70 0.7 8343 83.4 - SB-KERNEL:UB32-BASH-COPY
12 56 0.6 56 0.6 8399 84.0 - SB-KERNEL:%SXHASH-SIMPLE-SUBSTRING
13 51 0.5 51 0.5 8450 84.5 - MAKE-CPD
14 48 0.5 160 1.6 8498 85.0 - GET-OUTPUT-STREAM-STRING
15 48 0.5 48 0.5 8546 85.5 - WRITE-STRING
16 44 0.4 44 0.4 8590 85.9 - SB-KERNEL:%COERCE-CALLABLE-TO-FUN
17 43 0.4 741 7.4 8633 86.3 - PRINC
18 43 0.4 60 0.6 8676 86.8 - POSITION
19 39 0.4 151 1.5 8715 87.2 - SB-IMPL::%WRITE-STRING
20 39 0.4 46 0.5 8754 87.5 - SB-KERNEL:STRING=*
21 37 0.4 195 2.0 8791 87.9 - SB-KERNEL::SPECIFIER-TYPE-R
22 37 0.4 169 1.7 8828 88.3 - OPERATE-FACTOR
23 36 0.4 68 0.7 8864 88.6 - SB-VM::GENERIC-+
24 36 0.4 36 0.4 8900 89.0 - COPY-LIST
25 35 0.4 231 2.3 8935 89.4 - SB-KERNEL:SPECIFIER-TYPE
26 33 0.3 314 3.1 8968 89.7 - SB-INT:%INTERN
27 32 0.3 9146 91.5 9000 90.0 - CANDIDATE-NODES
28 31 0.3 31 0.3 9031 90.3 - SB-IMPL::SETUP-PRINTER-STATE
29 30 0.3 79 0.8 9061 90.6 - COPY-SEQ
30 30 0.3 45 0.4 9091 90.9 - GET-FULLY-QUALIFIED-CPD-VARS
31 30 0.3 30 0.3 9121 91.2 - SB-IMPL::OUTPUT-SYMBOL
32 28 0.3 1724 17.2 9149 91.5 - GENERATE-CPD-VARS
33 26 0.3 63 0.6 9175 91.8 - SB-INT:EQUAL-BUT-NO-CAR-RECURSION
34 25 0.3 25 0.3 9200 92.0 - SB-IMPL::VECTOR-SUBSEQ-DISPATCH/SIMPLE-VECTOR
35 24 0.2 24 0.2 9224 92.2 - (SB-IMPL::OPTIMIZED-DATA-VECTOR-REF T)
36 23 0.2 23 0.2 9247 92.5 - SB-KERNEL:HAIRY-DATA-VECTOR-REF/CHECK-BOUNDS
37 21 0.2 685 6.8 9268 92.7 - (LABELS SB-IMPL::HANDLE-IT :IN SB-KERNEL:OUTPUT-OBJECT)
38 20 0.2 70 0.7 9288 92.9 - SB-IMPL::COMPUTE-SYMBOL-HASH
39 19 0.2 1295 12.9 9307 93.1 - COMBINE-SYMBOLS
40 19 0.2 395 4.0 9326 93.3 - INTERN
41 19 0.2 104 1.0 9345 93.5 - (FLET SB-IMPL::REPLACE-ALL :IN GET-OUTPUT-STREAM-STRING)
42 19 0.2 19 0.2 9364 93.6 - SB-C:RETURN-MULTIPLE
43 19 0.2 19 0.2 9383 93.8 - SB-KERNEL:VECTOR-SUBSEQ*
44 18 0.2 133 1.3 9401 94.0 - COPY-CPD
SBCL 用户手册描述了如何解释此表:
For each function, the table will show three absolute and relative sample counts. The Self column shows samples taken while directly executing that function. The Total column shows samples taken while executing that function or functions called from it (sampled to a platform-specific depth). The Cumul column shows the sum of all Self columns up to and including that line in the table.
正如您所看到的,前三个条目中有两个是与 subst 相关的函数,并且在这些函数期间获取的样本百分比不成比例地多于其余函数调用。这让我想知道,subst 是在 sbcl 中以有效的方式实现的吗?如果没有,是否有更有效的替代方案可以用来执行替换?
感谢您的帮助
最佳答案
查看标准函数 sublis
和 nsublis
。他们使用关联列表进行替换。
CL-USER > (sublis '((x . 10) (y . 20))
'(* x (+ x y) (* y y)))
(* 10 (+ 10 20) (* 20 20))
风格:
我不会以递归方式编写替换函数。
(defun subst-bindings (bindings generic)
(loop for (b v) in bindings
do (setf generic (subst v b generic)))
generic)
上面确保它实际上是一个循环,并且解构使代码在这种情况下阅读起来更短。在可移植的 Common Lisp 中,尾递归函数并不总是转换为有效的循环。
关于lisp - SBCL "subst"效率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60233884/
假设我与两个内图f和g有传递关系~。假设 f 和 g 处处一致且 f a ~ f b ~ f c那么有两种方式显示g a ~ g c:通过给定的等式将每个 f 转换为 g 然后应用及物性,或者应用传递
我有一个 Makefile,大致如下所示: FIGURES = A1_B1_C1.eps A2_B2_C2.eps A3_B3_C3.eps NUMBERS = 1 2 3 all : $(FIGUR
假设我与两个内图f和g有传递关系~。假设 f 和 g 处处一致且 f a ~ f b ~ f c那么有两种方式显示g a ~ g c:通过给定的等式将每个 f 转换为 g 然后应用及物性,或者应用传递
我刚刚编写了一个程序,在循环内调用 subst 以及许多其他函数,到目前为止,subst 函数调用占用的时间最多时间。下面是一段概念性的代码片段,其中包含了我编写的程序的精髓。 (loop
当我们附加可移动驱动器时,操作系统会为其分配驱动器号。另一种方法是使用 subst 命令将本地文件夹映射到任何驱动器。我正在编写资源管理器的 Hook ,我需要在其中区分这两个驱动器。我尝试使用 Ge
在Windows中使用subst命令创建虚拟驱动器有什么意义。我正在为我的原始源代码目录创建虚拟驱动器,然后使用虚拟驱动器进行编译、编辑等所有操作。 它的主要用途是什么?我们不能在我 checkout
我想在 for 中进行字符串替换使用命名捕获阻止。我希望得到数字 1,2,3 作为输出。但它是Nil第一次运行,然后 1 和 2 用于第二次和第三次运行。如何使用 .subst在循环构造中正确吗?我在
我正在公司开发一个内部搜索引擎,使用 Flask 和 sqlalchemy(sqlite) 用 python 编写。我目前的问题是我愿意。 A.) 查询描述字段的一定信息量B.) 最好在它之前 50
我已经通过 HKCR\Drive\shell\MapLocalDriveHere\command 中的注册表向我的上下文菜单添加了一个命令,这样当我右键单击一个驱动器时。我希望它给我右键单击的驱动器名
我有以下 powershell 2.0 脚本: function getFreeDrive { [char[]]$driveLetters = @([char]'E'..[char]'Z')
我在从 Windows 批处理文件调用 SUBST 时遇到问题。我想使用一批来创建虚拟驱动器映射,并使用第二批来卸载驱动器。但是卸载给出了错误信息: The system cannot find th
情况 我们有一个 git 工作流程,其中所有发布版本都堆叠在 master 分支上,当提交准备好部署时,我们为其添加一个标签,然后使用 git archive 构建要部署的包。 我们使用一个 vers
我参加了 CPP 语言类(class),我试图了解 makefile 中“subst”的用法(一般情况下)以及此 makefile 中的具体用法。 我试图用谷歌搜索“subst”的用法,但没有找到。
我需要将子字符串移动到时间戳字段中。但是如果我编译它,我会得到错误号 RNF7416 - EVAL 运算中表达式左右两侧的操作数类型不匹配。 代码: MONITOR; TSTPFIELD = %S
我想知道是否有一种通用的方法可以使用驱动器号(例如 X:\foo\bar.txt )将路径解析为其等效的 UNC 路径,这可能是以下之一: X:\foo\bar.txt如果 X:是真正的驱动器(即硬盘
我有以下列表: (1 (2)) 我想用 (2 (3)) 代替 (2) 以获得: (1 (2 (3))) subst 的使用没有返回想要的结果: (subst '(2 (3)) '(2) '(1 (2)
我在 Windows 上的开发环境包括子文件夹,即文件夹 c:\MyBuild 可以替换为驱动器号,例如 t: 在 Ubuntu 子系统终端中,我可以将文件夹绑定(bind)到挂载,如下所示 sudo
我在 Windows 的 subst 文件夹中运行 python 脚本: c:\MyFolder\Tmp\Code\subst O: . O:\script.py script.py 正在运行 get
我正在尝试在我的 Windows 设置上映射一个虚拟驱动器,我使用的工具之一不喜欢文件名中的空格。 在命令行上,我会执行以下操作 subst l: "c:\Program Files\Complier
使用 创建的文件夹SUBST cmd 不工作 IIS 6 .在 IIS 7 (使用 Windows 7)浏览时未列出虚拟驱动器,以便为虚拟目录设置物理路径。 任何人都可以告诉我如何解决这个问题? 除了
我是一名优秀的程序员,十分优秀!