设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 8989|回复: 24
打印 上一主题 下一主题

[已经解决] if not和unless有什么区别

[复制链接]

Lv3.寻梦者

梦石
0
星屑
1045
在线时间
1564 小时
注册时间
2008-7-30
帖子
4418

贵宾

跳转到指定楼层
1
发表于 2010-7-4 21:17:18 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有帐号?注册会员

x
本帖最后由 DeathKing 于 2010-7-5 02:00 编辑

NetBeans中首选项有这么一项:“将if取反语句变为unless”,我不知道有什么区别,就用Benchmark库做了下面的测试。

希望没有什么语法错误
  1. require 'Benchmark.rb'

  2. TEST_TIMES = 9999999
  3. TEST_STATE = false

  4. Benchmark.bmbm(15) do |t|
  5.         t.report("if not")  {
  6.                 TEST_TIMES.times do
  7.                         if not TEST_STATE
  8.                                 true
  9.                         end
  10.                 end
  11.         }
  12.         t.report("unless") {
  13.                 TEST_TIMES.times do
  14.                         unless TEST_STATE
  15.                                 true
  16.                         end
  17.                 end
  18.         }
  19. end
复制代码
结果是这样的:
  1. Rehearsal --------------------------------------------------
  2. if not           3.954000   0.000000   3.954000 (  4.109375)
  3. unless           3.593000   0.000000   3.593000 (  3.730469)
  4. ----------------------------------------- total: 7.547000sec

  5.                      user     system      total        real
  6. if not           4.219000   0.000000   4.219000 (  4.281250)
  7. unless           3.625000   0.000000   3.625000 (  3.699219)
复制代码
明显unless要快,是因为if not要计算两次么?

See FScript Here:https://github.com/DeathKing/fscript
潜心编写URG3中。
所有对URG3的疑问和勘误或者建议,请移步至发布页面。
欢迎萌妹纸催更

Lv2.观梦者

神隐的主犯

梦石
0
星屑
258
在线时间
271 小时
注册时间
2008-2-22
帖子
7691

贵宾

2
发表于 2010-7-4 21:23:01 | 只看该作者
估计是 if not 先取反再判断, unless 直接判断~

《天空之城 —— 破碎的命运》
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
270 小时
注册时间
2010-2-4
帖子
1305
3
发表于 2010-7-4 21:30:17 | 只看该作者
if not是两步,unless是一步,自然是unless快了...- -b话说lz思考问题真精确
好歹当年也当过大魔王过,orz
回复 支持 反对

使用道具 举报

Lv1.梦旅人

万物创造者

梦石
0
星屑
54
在线时间
352 小时
注册时间
2008-2-15
帖子
2432
4
发表于 2010-7-4 21:44:27 | 只看该作者
  if not true and false---》不满足

  unless true and false---》满足

not的优先权问题,速度在RM里倒真看不出来……毕竟是位运算嘛

评分

参与人数 1星屑 +200 收起 理由
DeathKing + 200 认可答案

查看全部评分

From mortal hope immortal power springs.
回复 支持 反对

使用道具 举报

头像被屏蔽

Lv1.梦旅人 (禁止发言)

梦石
0
星屑
46
在线时间
11 小时
注册时间
2009-6-4
帖子
210
5
发表于 2010-7-4 22:04:10 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
签名被屏蔽
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
416 小时
注册时间
2006-10-21
帖子
1245
6
发表于 2010-7-4 22:07:55 | 只看该作者
我都以为走错了
看新手贴看多了
现在突然看到技术贴 我的裤裆立刻就湿润了

点评

下面的回复更是越看越湿  发表于 2010-7-5 00:04
回复 支持 反对

使用道具 举报

Lv1.梦旅人

不画画就死星人

梦石
0
星屑
164
在线时间
1818 小时
注册时间
2007-6-14
帖子
3219
7
发表于 2010-7-4 22:21:59 | 只看该作者
很惊艳。。之前一直觉得只是写法不同以适应不同编程习惯的人
渣绘关注慎重
[url=http://www.pixiv.net/member.php?id=1160389][color=DimGray]http://www.pixiv.net/member.php?id=1160389[/color][/url]
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
61
在线时间
24 小时
注册时间
2008-8-5
帖子
1924
8
发表于 2010-7-5 00:00:34 | 只看该作者
其实这属于架构不独立的细节问题,我刚用你的代码在 Linux AMD Opteron 2CPU/8GB/Sun Fire X4200 上测试,结果是:

  1. Rehearsal --------------------------------------------------
  2. if not           3.520000   0.580000   4.100000 (  4.102890)
  3. unless           3.160000   0.500000   3.660000 (  3.667306)
  4. ----------------------------------------- total: 7.760000sec
  5.                      user     system      total        real
  6. if not           3.150000   0.500000   3.650000 (  3.649854)
  7. unless           3.140000   0.700000   3.840000 (  3.843158)
复制代码
运行时环境稳定下来后似乎也不见得有啥区别
然后试了下 Solaris 4CPU/8GB/Sun V440
  1. Rehearsal --------------------------------------------------
  2. if not          22.170000  34.620000  56.790000 ( 56.824471)
  3. unless          23.200000  34.020000  57.220000 ( 57.239640)
  4. --------------------------------------- total: 114.010000sec

  5.                      user     system      total        real
  6. if not          21.620000  35.040000  56.660000 ( 56.664212)
  7. unless          22.950000  33.930000  56.880000 ( 56.911735)
复制代码
也没看出明显区别

从形式语言的翻译规则上来看,前者是应该先取反,然后分歧跳转,而后者直接分歧跳转。但实际上解释器也会做相应的优化,比如 if not expr 这种语法,解释器完全可以翻译成:

        cmp eax 0                    ; 假设这里 eax 是 expr 解析后的结果值
        je if_not
         ; ..... if not not false
if_not:
        ; ...... if not false

而不是:
        not eax
        cmp eax 1
        je if_not
         ; ..... if not not false
if_not:
        ; ...... if not false

当然上面的指令只是针对 x86,不同的架构也可能有不同的表现

点评

也就是不必过分纠结if not和unless熟快熟慢了?  发表于 2010-7-5 00:25

评分

参与人数 1星屑 +300 收起 理由
DeathKing + 300 认可答案

查看全部评分

回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
60
在线时间
1 小时
注册时间
2009-9-19
帖子
137
9
发表于 2010-7-5 00:29:36 | 只看该作者
愚以为4.2和3.6不算区别,更何况这是9999999次重复的累计时间,少量操作根本不是可见的差异
另外评价时间应该还要加上复合条件判断的时间,比如if not xxx and xxx和unless xxx or xxx
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
1045
在线时间
1564 小时
注册时间
2008-7-30
帖子
4418

贵宾

10
 楼主| 发表于 2010-7-5 00:37:57 | 只看该作者
愚以为4.2和3.6不算区别,更何况这是9999999次重复的累计时间,少量操作根本不是可见的差异
另外评价时间应 ...
darkdrium 发表于 2010-7-5 00:29



复合条件最后也不是要转化为true和false么?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-4-27 02:26

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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