原帖由 Tanknet 于 2007-7-2 10:18 发表
MS .NET的编译器有一种机制你知道吗?
它辨认出不影响运行结果的东西根本不写进MSIL代码。
比如
Function foo() as Int32
dim a as integer =2, b as integer=3
For a=0 To 10000
b=b ...
原帖由 Tanknet 于 2007-7-2 10:18 发表
MS .NET的编译器有一种机制你知道吗?
它辨认出不影响运行结果的东西根本不写进MSIL代码。
比如
Function foo() as Int32
dim a as integer =2, b as integer=3
For a=0 To 10000
b=b ...
原帖由 bessel 于 2007-7-2 15:40 发表
多数编译器都是这么干的,
这个程序你只要最后输出这几十万个数,他就不会忽略了,
然后这个程序就怎么也跑不玩了。
9千万亿=9百万 G,大概要多少时间可以很容易的估计处来了。
原帖由 FENG950 于 2007-7-2 15:44 发表
我所知道没有什么编译器会这样篡改编写者的意图,其实这种事试一下就知道了,VS2003下编译,release模式
using System;
namespace ConsoleApplication1
{
///
/// Class1 的摘要说明。
///
cl ...
原帖由 bessel 于 2007-7-2 16:44 发表
俺以前用那个visual fortran的时候遇到过这样的情况,当时另一个编译器也是这样,不过ifort还好。
楼主的问题如果只排一次序的话要大概几分钟,10w次很快算完一定是有偷工减料的地方。
原帖由 FENG950 于 2007-7-2 16:57 发表
LZ的源码也没看见,不能说是编译器偷工减料吧?编译器偷工减料就是很严重的问题了。或许是他的算法捏?
前面有人说.net的编译忽略部分代码,我估计他们是不是搞成JIT部分了?JIT是有可能运行中没用到的代码 ...
原帖由 FENG950 于 2007-7-2 18:34 发表
的确,有时候是有很多多余的代码需要清除,一般编译器是会使用等价的替换代码来优化那些罗嗦的代码,但像这些不直接使用结果的应该不在此列,因为编译器不能替程序员作出结论,不能说结果没有使用就一定无用,或 ...
原帖由 zxjike 于 2007-7-2 22:35 发表
晕了,原来我看得不是LZ的程序。
Sorry!FENG950 的程序肯定会跑到底的,LZ后来贴的也不存在略过的问题。
是第一页那个最后直接赋值的那个程序中间的循环会略过。
网络慢,现在才看到LZ的程序。
原帖由 FENG950 于 2007-7-2 22:38 发表
好了,知道慢的原因了,漏抄了一句i++;
这回是release模式,有Console.WriteLine()输出的,屏幕最后一行是时间:16ms。
原帖由 zxjike 于 2007-7-2 23:22 发表
以前我的组有个家伙写程序风格老是这样。
Release模式一跑就乱套,Debug还查不到,几万行原来都是if ... endif中间调用的函数,因为if空的都不执行....
原帖由 zxjike 于 2007-7-2 23:34 发表
这样的
if Test()=False Then
中间原来有Exit sub,注释掉了就什么都没有了。
EndIF
Private function Test() as boolean
...
...
End Function
然后Debug下Test能执行,Release下就不执行。
原帖由 FENG950 于 2007-7-2 23:37 发表
其实LZ那个程序有问题,内循环只执行一次(从0到300000),因为K没有复位,因此外循环第一次以后再进入时K都不会小于300000,所以时间其实很短,只有第一次0到300000是真正在做计算。
| 欢迎光临 POPPUR爱换 (https://we.poppur.com/) | Powered by Discuz! X3.4 |