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

Project1

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

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

[复制链接]

Lv3.寻梦者

梦石
0
星屑
1055
在线时间
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的疑问和勘误或者建议,请移步至发布页面。
欢迎萌妹纸催更

Lv1.梦旅人

梦石
0
星屑
61
在线时间
24 小时
注册时间
2008-8-5
帖子
1924
25
发表于 2010-7-5 01:33:24 | 只看该作者
本帖最后由 紫苏 于 2010-7-5 06:19 编辑

解释性语言运行程序的效率确实没有直接执行编译好的机器码高,但她的一大特点就是调试周期比编译性语言的周期短(这个周期的过程,前者是:编辑代码 - 解释 - 调试;后者是:编辑代码 - 编译链接 - 运行 - 调试)。解释性语言只需要整体分析一下语法,然后就马上开始执行第一条语句,而编译性语言在语法分析的同时还需要把所有代码编译为机器可读的二进制码,然后把不同的对象文件链接起来。这在制造原型和测试的时候就比较重要了,你调试的次数越多,就越能通过使用解释性语言来节省时间。编译性语言虽然也有一些优化速度的机制,如预编译文件,但整体还是不如解释性语言

恩,matz的确是这样想的,所以就抛弃了指针?

DeathKing 发表于 2010-7-5 01:14


其实不要指针的原因是多方面的,其中一个比较重要的是为了在内存托管机制下减少堆内存碎片——在大多数现代高级语言中,只要是有垃圾回收机制的,都不会提供指针。在堆中分配的内存通常都是零散的(这也是为什么这种内存区域叫“堆”,顾名思义,没有次序的一堆),会导致堆内存中产生很多碎片,而当对象被垃圾回收后,GC 就会紧缩内存,整理碎片,这样才能提高分配堆内存的效率(因为分配堆内存需要在“杂乱的一堆”中找到一块足够大的连续空间)。这样一来,就需要把内存中的对象移来移去,自然指向这个对象的引用的地址也会改变。由于所有该对象的引用在底层都是指向同一个指针(而这个对象唯一的指针又指向该对象),所以只需要改变这个指针的值,就能改变所有引用指向的值。但这在 C++ 中却是不可能的,因为 C++ 可以操纵任意数量的指针指向任意地址
除此之外还有其它原因,比如安全性:有指针就有可能导致内存泄漏,崩溃,访问不可访问、释放已被释放的地址而导致段错误等,引用则不会出现这些问题
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
61
在线时间
24 小时
注册时间
2008-8-5
帖子
1924
24
发表于 2010-7-5 01:20:51 | 只看该作者
回复

本来想点评的,结果回复了自己一个空帖子,防止被版主抓到而已灌水,将点评放到这里了。。。

从人 ...
darkdrium 发表于 2010-7-5 00:58


哦,理解错了,但至少英语语法里不需要那个“否则”的:
unless it rains tomorrow, we would go out.
可能用在句末更顺口,Ruby 也支持这样的语法:
goOut() unless rain

点评

是啊,其实还是语言的问题,unless在汉语中并不常用,因为等价于“除非”+“否则”  发表于 2010-7-5 01:23
优美、简洁的修饰符结构?  发表于 2010-7-5 01:21
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
60
在线时间
1 小时
注册时间
2009-9-19
帖子
137
23
发表于 2010-7-5 01:16:30 | 只看该作者
回复 DeathKing 的帖子

要效率就不要ruby了,ruby发明的初衷,就是为了解放程序员的,现在的计算机,运算效率已经很高了,没必要为了那么点效率苦了程序员


   

点评

恩,matz的确是这样想的,所以就抛弃了指针?  发表于 2010-7-5 01:20
回复 支持 反对

使用道具 举报

Lv3.寻梦者

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

贵宾

22
 楼主| 发表于 2010-7-5 01:14:31 | 只看该作者
回复

呵呵,对的,不过我说的是效率,i++ 要额外使用一个寄存器保存 i 的值作为返回值,然后再把 i 加 1 ...
紫苏 发表于 2010-7-5 01:12


效率这种事应该要交给解释器或者编译器来优化,然后自己再在解释器或者编译器那里效率完美主义。

觉得NOI除了搞算法剩下的也只有效率完美主义了。

点评

学校没组织,只是看了几本教材而已。再说咱对Pascal无爱,C入门,II参加过。  发表于 2010-7-5 11:31
NOI?orz……DeathKing君是参加NOI的大牛?  发表于 2010-7-5 08:34
其实我们在这讨论的都属于小细节,无伤大雅,但有时确实不能完全相信编译器——一个经典的例子:大部分 C/C++ 编译器都没有尾部递归优化,所以在 C/C++ 中递归效率不如循环   发表于 2010-7-5 02:13
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
61
在线时间
24 小时
注册时间
2008-8-5
帖子
1924
21
发表于 2010-7-5 01:12:24 | 只看该作者
回复 DeathKing 的帖子

呵呵,对的,不过我说的是效率,i++ 要额外使用一个寄存器保存 i 的值作为返回值,然后再把 i 加 1,而 ++i 直接把 i 加 1,返回 i
这个区别在硬件飞速发展的今天已经是微乎其微了,虽然很多高手还是坚持“效率完美主义”,但我觉得应该把精力放在分析算法复杂度上,那才是大头儿
回复 支持 反对

使用道具 举报

Lv3.寻梦者

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

贵宾

20
 楼主| 发表于 2010-7-5 01:03:49 | 只看该作者
回复

本来想点评的,结果回复了自己一个空帖子,防止被版主抓到而已灌水,将点评放到这里了。。。

从人 ...
darkdrium 发表于 2010-7-5 00:58


我们英语老师说,unless你别翻译为除非,要翻译为“如果不”。{:nm_3:}

点评

我也觉得,把unless翻成除非到底是哪个人的脑残翻译,除非是除了不是的意思,除了不是那就是是了,就相当于如果,unless应该翻成不能省去以下条件。  发表于 2010-7-5 09:51
善!就是这么说!我每次都脑补的  发表于 2010-7-5 01:06
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
60
在线时间
1 小时
注册时间
2009-9-19
帖子
137
19
发表于 2010-7-5 01:03:12 | 只看该作者
回复 DeathKing 的帖子
。。。他应该是说效率上的差别。。。

   

点评

网络缘故连帖了,请版主杀了这楼吧- -  发表于 2010-7-5 01:09
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
60
在线时间
1 小时
注册时间
2009-9-19
帖子
137
18
发表于 2010-7-5 01:00:51 | 只看该作者
回复 DeathKing 的帖子
。。。他应该是说效率上的差别。。。

   
回复 支持 反对

使用道具 举报

Lv3.寻梦者

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

贵宾

17
 楼主| 发表于 2010-7-5 00:59:37 | 只看该作者
回复 紫苏 的帖子

的确,i++和++i的区别貌似还是很大。

应该就是这个意思,貌似和“结合能力”扯上关系:

  1. #include <stdio.h>
  2. int main()
  3. {
  4. int i = 1,a,b;
  5. a = i++;
  6. b = ++i;
  7. printf("%d %d %d",i,a,b);
  8. }
复制代码
输出 3 1 3

++i 是先自加i然后再复制,i++则相反?

点评

这里如果要用 +=,可以让 i 初始为 -1,然后 a[i+=1]  发表于 2010-7-5 13:02
a=[1,2,3,4,5,6] s=0,i=0 while(true){ s+=a[i++] if i=7 break }  发表于 2010-7-5 11:41
+= 不行么? 或者用next方法。 1.next #=>2  发表于 2010-7-5 01:10
话说js有数组取index的时候就++的,愚以为这个语法相当优雅,可惜ruby不能。。。  发表于 2010-7-5 01:07
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-5-14 13:53

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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