明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1745|回复: 5

[讨论] 验证 函数另类定义 的代价 !

[复制链接]
发表于 2014-7-31 11:13 | 显示全部楼层 |阅读模式
        看过 长老ll_J的 “自定义函数” 的文章后,就习惯了 不打lambda

今天无聊就 测试了下 这种 另类的自定义函数 是否 既省时又省事!结果大大出乎我的意料!

验证代码如下!
  1. (defun t11 (/ t1)
  2.     (setq t1 (getvar "cdate"))
  3.     (repeat 100000(mapcar ''((x y)(+ x y))'(1 2 3)'(1 2 3)))
  4.     (gxl-sys-timeout t1)
  5.     (setq t1 (getvar "cdate"))
  6.     (repeat 100000(mapcar '(lambda(x y)(+ x y))'(1 2 3)'(1 2 3)))
  7.     (gxl-sys-timeout t1)
  8. )
  9. ;命令: (T11)
  10. ; 用时 2.92188 秒
  11. ; 用时 0.390625 秒
  12. (defun t12 (/ t1)
  13.     (setq t1 (getvar "cdate"))
  14.     (repeat 100000(mapcar (function(lambda(x y)(+ x y)))'(1 2 3)'(1 2 3)))
  15.     (gxl-sys-timeout t1)
  16.     (setq t1 (getvar "cdate"))
  17.     (repeat 100000(mapcar '(lambda(x y)(+ x y))'(1 2 3)'(1 2 3)))
  18.     (gxl-sys-timeout t1)
  19. )
  20. ;命令: (T12)
  21. ; 用时 0.40625 秒
  22. ; 用时 0.394531 秒
  23. (defun t13 (/ t1)
  24.     (setq t1 (getvar "cdate"))
  25.     (repeat 100000(mapcar '(lambda(x y)(+ x y))'(1 2 3)'(1 2 3)))
  26.     (gxl-sys-timeout t1)
  27.     (setq t1 (getvar "cdate"))
  28.     (repeat 100000(mapcar (quote(lambda(x y)(+ x y)))'(1 2 3)'(1 2 3)))
  29.     (gxl-sys-timeout t1)
  30. )
  31. ;命令: (T13)
  32. ; 用时 0.386719 秒
  33. ; 用时 0.390625 秒
  34. (defun gxl-sys-timeout (t1 / t2 t3 t4 t5 t6 t7 t8)
  35.     (setq t2 (getvar "Cdate"))
  36.     (setq t3 t1)
  37.     (setq t4 (fix (* 100 t3))
  38.         t5 (- (fix (* 10000 t3)) (* t4 100))
  39.         t6 (- (* 1000000 t3) (* t5 100) (* t4 10000))
  40.         t7 (+ (* t4 3600) (* t5 60) t6)
  41.     )
  42.     (setq t3 t2)
  43.     (setq t4 (fix (* 100 t3))
  44.         t5 (- (fix (* 10000 t3)) (* t4 100))
  45.         t6 (- (* 1000000 t3) (* t5 100) (* t4 10000))
  46.         t8 (+ (* t4 3600) (* t5 60) t6)
  47.     )
  48.     (princ "\n 用时 ")
  49.     (princ (- t8 t7))
  50.     (princ " 秒 ")
  51.     (princ)
  52. )
"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2014-7-31 14:30 | 显示全部楼层
_$ (t11)

用时 7.26563 秒
用时 0.875 秒
_$ (t12)

用时 0.71875 秒
用时 0.828125 秒
_$ (t13)

用时 0.671875 秒
用时 0.78125 秒
_$
发表于 2014-7-31 15:11 | 显示全部楼层
t13中两个都是使用一样的函数,只是写法不同。
t12中使用了function函数,这个函数的意义是内部优化,对复杂函数应该有效,这种简单函数几乎无从优化,也就不会有什么差别了。
t11一个使用了函数,另一个使用了表达式串,明显是不同的,表达式每次都要“解释”,所以速度会慢。
发表于 2014-7-31 18:18 | 显示全部楼层
重复10万次才差0.1秒——实在没必要纠结!

即使代码完全一样,耗时也不一样!

点评

主要是t11,差了8倍。看来lambda还是省不得  发表于 2014-7-31 21:15
发表于 2014-8-1 09:11 | 显示全部楼层
lisp是解释运行的,代码越长速度会越慢。
 楼主| 发表于 2014-8-1 11:35 来自手机 | 显示全部楼层
ZZXXQQ 发表于 2014-8-1 09:11
lisp是解释运行的,代码越长速度会越慢。

我也那么理解的!

所以我就不写lambda了!结果不写速度更慢!

而且慢很多

点评

两个单撇号可是两个函数  发表于 2014-8-1 21:03
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-4-20 10:16 , Processed in 0.647446 second(s), 34 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表