wayne
发表于 2018-1-2 16:08:39
liangbch 发表于 2018-1-2 14:45
38楼数据比我的环境稍微大了那么一点点。 所有是时间都是15.625 毫秒的整倍数,15.625 正好等于1/64秒,即3 ...
换成了在线版本,准确的说,是Linux系统,不存在这个问题.你看看:
https://www.wolframcloud.com/objects/2b992a84-4a9d-4c7d-94d0-cd859e8c6daa
wayne
发表于 2018-1-3 11:02:00
本来昨天我正在编辑一个长篇的帖子,关于Mathematica时间函数AbsoluteTiming与Timing的区别.进而摆出我的观点,liangbch的关于Mathematica的测试代码是不科学的,仅凭测评代码,就下结论说Mathematica算法不如他的好 有点不公平,或者说过于草率.结果引发了一个新的问题,就是Mathematica的windows版本的时间粒度最小是15.625ms. 把话题岔开了.
=============================================
OK.总结一下:
1) 关于Mathematica,如果目的是测试核心算法的性能则一定是用Timing函数,该函数返回的是CPU耗时,而那些通信,IO等待,中断,页错误啥的,都是不考虑在内的.而AbsoluteTiming则考虑了这些.虽然二者都不考虑结果的格式化输出时间.
如果你要比拼算法性能,肯定要用Timing更合适.
2)关于Mathematica的windows版本的Timing函数的时间最小粒度是15.625ms, 这个好像是windows应用程序的一般性问题[根据liangbch提供的链接]
3)AbsoluteTiming不合适,时间粒度又跟不上,所以我们就要加大循环次数.只有如此了. 还有另一种策略,就是使用Mathematica的C/C++接口来测试.
gxqcn
发表于 2018-1-3 14:13:16
我以前只知道Mathematica的Timing,不知道还有AbsoluteTiming函数,而且还有这么大的区别,受教了。:)
只是呼吸
发表于 2018-1-3 21:38:24
恭喜liangbch!
声明一下:我是您的忠实粉丝!
我在这个论坛里,学到了很多知识,尤其是在您的文章中,得到的帮助最大。(mathe 也给了我一次帮助,在此谢谢 mathe 啦!)
我写程序是出于爱好,能让计算机一下子算出一大堆数字,还不能出错,心里还是有点高兴的。
牛顿除法我终于把它弄好了。我下一步的目标是尝试把牛顿除法弄简单点,因为我写的牛顿除法看上去有点臃肿。同时还要研究一下,商的最末一位有时不正确。
楼主提到了写论文,支持!一定要写。您的创造性的成果一定要写。
liangbch
发表于 2018-1-4 11:02:47
liangbch的关于Mathematica的测试代码是不科学的,仅凭测评代码,就下结论说Mathematica算法不如他的好 有点不公平,或者说过于草率
我认为你的结论过于草率了,你甚至没有仔细的运行我的程序,甚至没有认真的的阅读我的代码,就妄下结论,原因有3
1. 如果你仔细地运行我的代码,就会发现AbsoluteTiming 和Timing得到的结果在误差范围内是相同的,就算不科学,和Timing的结果差别也不会太大,退1万步,就算误差增加很多倍,也不会导致mathematica的性能超过我的版本。
2. 如果你仔细的读过我的代码,就不会在3天前(25#)提出第二个建议,“所以我们最好是采取重复计算足够多的次数,拉开计算误差。这样才有效。”,我的代码本来就是这么做的,循环足够的的次数,直到总的运行时间超过1秒。
3. 我在28楼就提到,windows下的时间粒度是15.6毫秒,而且在37楼给出测试代码和结果,你则
a. 在37楼的点评中,在没有给出运行结果的情况下,直接否定。
b. 38楼你的测试结果中已经能够说明时间粒度是15.6毫秒,你依然没有给出怀疑和解释,直到2个半小时后,在我给出其他证据时,你才不得不承认。
我不否认wayne是优秀的软件工作者。但是,每个人都会犯错,尤其是在某方面有很大成绩时,可能会有先入为主的观点,进而影响判断能力,分析能力。
人们总是只看到自己希望看到的,对于非期望的结果,往往会忽视,这是一个普遍现象,历史上很多科学家在实验中首次发现新的现象,但却与伟大发明失之交臂,如
1. 约里奥.居里首先在实验中发现中子,但认为是r射线,因此错误了诺贝尔奖。
2. 德国化学家李比希在实验中发现碘,但这位化学家却认为是氯化碘,从而错过了碘元素的发现。
3. 卡文迪许比拉姆塞早100多年,就发现了空其中的氮气不是单一物质,而拉姆塞却能从2种氮中密度相差千分之一的线索中发现惰性气体。
wayne
发表于 2018-1-4 14:47:32
^_^,先致歉.这种碰撞很难得,如能把东西讲透彻,对我也算是一种成长.
先容我对你的文字进行一一的拆解,思维的个体差异就表现在这字里行间.
我认为你的结论过于草率了,你甚至没有仔细的运行我的程序,甚至没有认真的的阅读我的代码,就妄下结论,原因有3
1. 如果你仔细地运行我的代码,就会发现AbsoluteTiming 和Timing得到的结果在误差范围内是相同的,就算不科学,和Timing的结果差别也不会太大,退1万步,就算误差增加很多倍,也不会导致mathematica的性能超过我的版本。
2. 如果你仔细的读过我的代码,就不会在3天前(25#)提出第二个建议,“所以我们最好是采取重复计算足够多的次数,拉开计算误差。这样才有效。”,我的代码本来就是这么做的,循环足够的的次数,直到总的运行时间超过1秒。
[背景解释]:我在发第一个帖子9#的时候,就马上开始下载你的测试代码了,而且是下载多次,如果你能在网站后台统计下载次数的话,应该能看到来源于至少3个IP的下载,都是我的机器.一个北京,一个上海,一个香港.统计起来至少5次.不过,我得承认,我当初确实是先发完帖子,再下载代码实际测试的,但测完之后我并没有对我9#的帖子做过任何修改,我的观点和态度也没有任何改变. 因为你是我非常佩服和仰望的几位前辈之一,所以我其实是很重视的.如果是"民科"级别的身份,我恐怕就因为根本不care,而视而不见了,这年头,90后都说自己老了,我这80后早已经没有了年轻时候的那种盛气凌人的干劲了,^O^.
[回到话题]:真正科学的误差分析理论其实是有一套严谨的计算套路的,我本科专业课有这一课,咱们这里先不较真下去了.在我的眼里,我所认为的"循环足够的的次数",这里的"足够多"的衡量标准就是"越多越好,但又不至于太多以至于影响了人的感官体验".换种说法,就是怎么滴就得搞个几十秒吧,:)
3. 我在28楼就提到,windows下的时间粒度是15.6毫秒,而且在37楼给出测试代码和结果,你则
a. 在37楼的点评中,在没有给出运行结果的情况下,直接否定。
b. 38楼你的测试结果中已经能够说明时间粒度是15.6毫秒,你依然没有给出怀疑和解释,直到2个半小时后,在我给出其他证据时,你才不得不承认。
[背景解释]: 在37#我的潜意识里并不是要否定你.我的跟评只是表明说15.6ms是平台实现相关的.其实我后来是编辑了一个长帖子的.本来是一个很好的补充,只是因为工作上的事情被中断了好几次,中断太多了就没了继续编辑的动力了,结果并没有发出来[不知道这种心境有没有人碰到过,我经常有].我的小姨子刚好休假在家,我让她打开了我的家用电脑,我用TeamViewer远程操作.特地嘱咐她[她不知道Linux是何物]怎么选择进入windows,而不是Ubuntu.我的windows用的少,所以Mathematica版本还是旧的11.1,[用旧版本不是我的风格].38#里贴出来只是说明15.625ms我在我自己的windows电脑上也得到了证实,但我并没有说我要承认什么.惭愧,编辑帖子其实是需要天时地利人和的,稍有打断,就容易断片.我到现在都不认为我需要承认什么.
[回到话题]: Mathematica是商业软件,文档里没有说明的东西是随时都可能会悄然发生变化的.文档里明确说了AbsoluteTiming 和Timing的时间粒度是平台相关的,具体值可以通过TimeUnit获取到.即便是你发现了Windows版本的Mathematica的TimeUnit不是声称的1/100s,而是15.625ms,也不能说明---既然Timing函数达不到你的精度要求,所以你只能用AbsoluteTiming函数----,个人认为这不应该是你选用AbsoluteTiming的合理理由.
[我的观点] 仅供参考:windwos下的Mathematica 的$TimeUnit =15.625ms,却不是软件所返回的1/100s,这里缺乏一个解释,我们暂时可以理解成是Mathematica的bug.根据你提供的链接,还有我自己的搜索,发现15.625ms这个问题其实不是Mathematica专有的.而是Windows操作系统层面的问题,很多Windows上开发软件的刷新率都下不了15.625ms,此时的我已经联想到Qt的QTimer的Windows版本曾经出现过的问题了,略过不表.当然你也可以认为这个是Mathematica的.但不管怎样,文档声明的东西就是可信的.API是可信的,而ABI不可信,这个你同意吧.咱们这里的问题就是这种性质.所以我需要承认什么呢?
我不否认wayne是优秀的软件工作者。但是,每个人都会犯错,尤其是在某方面有很大成绩时,可能会有先入为主的观点,进而影响判断能力,分析能力。
人们总是只看到自己希望看到的,对于非期望的结果,往往会忽视,这是一个普遍现象,历史上很多科学家在实验中首次发现新的现象,但却与伟大发明失之交臂,如
1. 约里奥.居里首先在实验中发现中子,但认为是r射线,因此错误了诺贝尔奖。
2. 德国化学家李比希在实验中发现碘,但这位化学家却认为是氯化碘,从而错过了碘元素的发现。
3. 卡文迪许比拉姆塞早100多年,就发现了空其中的氮气不是单一物质,而拉姆塞却能从2种氮中密度相差千分之一的线索中发现惰性气体。
[我的观点]我并没有认为我犯了什么错误了,也没觉得我有掩饰什么.一定要找找我是否存在什么过错,或者问题,我觉得可以说我有点"先入为主":
我是看到你在主题贴1楼的用词"可比现在最快软件Mathematica快2.8到8倍",对于这种用词,讲良心话,我比较排斥,视觉上的第一感受就是态度不够专业.就是觉得你不大可能写出公平的Mathematica/Maple测试代码,所以我犯了先评论后下载代码测试的毛病.但我想为自己,为所有人辩解一下,这种心理反应应该是很正常的呀,我们时时刻刻都在不假思索的给身边所有的人做基本的判断.你也会不假思索的认为我不可能对汇编指令了如指掌,这种心理跟我这里的心理是完全一样的嘛,^_^.当然你用"先入为主"这个词来形容这种心理行为也是可以的了.
[我的态度] liangbch是论坛里我特别敬佩和仰望的几位前辈之一,对,我是用敬佩和仰望来形容.我这人在现实生活中好像还没碰到让我折服的人的.
写了那么多口水之辞,咱们来点干货,欢迎碰撞拍砖,这个其实是我昨天就要发出来的:
对于跨编程语言,跨编程范式(指令式or函数式),跨工具[一个是C库,一个是软件系统]之间的性能对比测评,我觉得是件把自己推到舆论制高点,风口浪尖,是吃力不讨好的工作.做的好能彰显你的深度和广度还有严谨性,做的稍微有一丁点的不周到,会很容易被放大,乃至盖过你的亮点.不过,对于我来说,请放心了.
liangbch
发表于 2018-1-4 15:57:14
:handshake :handshake :handshake 谢谢wayne,一口气说了这么多,辛苦了。在探索真理的过程中,犯错在所难免,争论也在所难免,就连爱因斯坦也会犯错,也会有和波尔之间激烈的争论。重要的是,在此过程中,我们要学会严谨的治学态度,科学的方法。
设身处地的,如果别人宣称他的算法比Mathematica快,我也会怀疑的。但是如果你了解我的研究过程,阅读过多少论文,对这个问题思考了多少年?你或许对此不会感到太惊讶。
无论如何,还是很感谢你,感谢你第一时间去做测试...
落叶
发表于 2018-1-5 09:22:18
只是呼吸 发表于 2018-1-3 21:38
恭喜liangbch!
声明一下:我是您的忠实粉丝!
我在这个论坛里,学到了很多知识,尤其是在您的文章中,得 ...
确实如此,我在这个论坛得到了宝宝很多的帮助,宝宝的人品和技术是值得我仰望的!
mathe
发表于 2018-1-5 09:26:33
能够直接在C里面调用mathematica的内部接口,或者将你自己的算法编写成能够让mathematica调用的接口,然后用同样的方法去测量时间吗?这样会更加具有说服力。如果你想要发表文章,最好用这种方法去比较,避免没有必要的怀疑
wayne
发表于 2018-1-5 10:30:05
抽空补充一下.前面我们多次提及的windows下的时间粒度是15.625毫秒这种说法不够精准专业.准确的说,是Windows下的定时器timer的inteval默认最小只能设置为15.625ms, 微软这么搞是为了避免应用程序自由度太高,节省电池的寿命[确实,windows操作系统的一般应用场合犯不着使用这么高频的定时器来刷新,超过64Hz以上].我写了一小段代码,用C++11的high_resolution_clock测试,证实这个时钟精度在windows下可以达到nano seconds级别. 所以反过来说明Mathematica的 Timing 用的是定时器的timeout事件来计算耗时的.这个从侧面看得出来,Mathematica的核心代码应该是基于事件驱动的异步编程风格,时钟的timeout事件驱动,而不是我们一般所理解的一个start的,一个end,然后通过命令式的过程语言,diff = end -start来计算耗时.或者说Mathematica的定位是着眼于宏观范围的时间尺度的应用需求.也可以说是Mathematica的bug.
@liangbch, 平时我们也经常见到有人总是跟Mathematica比拼,好像也无伤大雅,但咱这里的比拼的时间尺度太小,是亚毫秒的级别,而且到了0.002ms这种,所以,我们就得对自己要求更加yanjin了...