刚才去C#地盘拍了一块砖。呵呵。
本来从不去看C#,但是CSDN推荐了的,就点进去看看了。
结果发现最烂的没有经过优化的Java程序,比优化得很好的C#还要快3倍。
如果运行相同的优化算法,岂不是要快10倍,一个数量级?C#大数的阶乘

解决方案 »

  1.   

    呵呵,我也来接分,C#和java各有利弊不能藐视哪一个
      

  2.   

    为了验证俺的观点,《算法导论》先放下,写个大数乘法,证明比C#快10倍。
    嘿嘿。那天冬子好像给过一个用String实现的,应该就可以用。
      

  3.   

    那楼主写一个java版本的pk一下吧。
      

  4.   

    我就偶尔来一次java版就看到这么惹眼的帖子。真是有缘。
      

  5.   

    你还是先弄清楚你调用的BigInter类内部实现机制,跟C#版那个帖子用的算法有什么差异再叫板吧.如果初级算法,不经过优化的,哪种语言效率都差不多(一个数量级内).
    想要提升速度就只有改算法.你拿不同算法的实现去进行效率比较,有意义?
    况且你用的是别人实现的BigInteger类."如果运行相同的优化算法,岂不是要快10倍,一个数量级?"
    你试试,按照C#那个帖子的算法,你用JAVA实现看看,能不能提高一个数量级.
      

  6.   

    我来接分吧,java和C##各有各的优缺点
      

  7.   


    你怎么知道我没弄清楚BigInteger?胡说八道。同样算法,汇编和basic能比速度吗?编译型语言和解释型语言,在一个数量级内?搞明白了数量级再回来开牙。那快的实现去比别人慢的实现,然后说别人慢,当然是不对的。
    但是你开牙前看清楚,我用BigInteger来做,是偷了懒的。BigInteger功能强大,但是效率并不快。我的程序里面,big = big.multiply(),10000次重新申请空间的做法,比C#的实现要慢的多。
    所以我才说,我这个粗糙的没有优化过的算法,都比C#那个快3倍。有时间我会试的。但是那个帖子,连n!是多少位都不会判断,我实在不知道说什么好。
      

  8.   


    你是想说29章的乘法电路?不是动不动就说C#烂,俺第一次说,就是因为那个帖子,然后稍微比较了一下。
    以前说MFC烂,那是我经常说的,10年前,抓了微软内部的几个bug,向西雅图报告过,他们态度非常好,但是那些bug实在太低级了,后来学了Java就放弃VC++了。
    后来公司有机会和微软里面玩COM内核的人打交道(不是俺,是另外一个牛人),发现原来微软的人自己不懂怎么用COM,为此工期差点延期,客户本来已经准备好文件去法院告微软了,后来那个牛人因为早就发现问题,公司高层也早做了准备,第一时间把微软的提案全部推翻重做,终于赶上客户的工期。为此,微软还给我曾工作过的这个公司奖状。
    所以,我不是动不动就说,是有确凿理由的。
      

  9.   


    您说的没错,看看发展情况就知道利弊了。http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html看看走向就知道,这4,5年来,C#的确从0.X%上升到4.X%。
    但是,同时VB也从8.X%下降到4.X%,也就是说C#只不过从自己的VB那里攒到点人品而已。两者加起来不到10%。
    而Java从2X%降到1X%,看得出是因为PHP,Python,Ruby的迅猛发展,被抢掉了很多份额。
    未来会怎么样不好说,特别是sun被oracle收购以后,java走向还是不明朗。
    但是不管怎么样C#要成为对手,可能还太早。
      

  10.   

    楼主牛人也~~~~
    微软的C#应该是参考了java。
      

  11.   

    可惜,java的开发效率就...,只能说你井底之蛙
      

  12.   


    恩。就是这个,我早上就把用这个斯特林公式推出来的阶乘长度的java代码贴在C#坛子里了。
    int d = (int) (((1.0 / 2.0 * Math.log(2 * 3.1416) + n * Math.log(n) - n) / Math.log(10)) + Math.log10(n)) + 1;
      

  13.   


    我从头到尾就没有鄙视过C#呀,俺对C#不熟,怎么会去鄙视它?
    只不过喜欢C#的人自以为被鄙视了而已。
    我也没有说过Java有绝对的优势。就执行效率而言class文件在jvm运行,怎么也比不上可执行程序直接在OS上执行。
    我的帖子只是想说:
    1,就计算n!的那个例子而言,C#慢
    2,既然要深入研究大数的n!并就结其速度,那么至少估算n!的长度的算法要准确点吧?
      

  14.   

    从头到尾都没有鄙视C#?原帖98楼的“看来C#真的很烂啊。”这句话是谁说的?我不想跟你在这里争论什么,只是希望你在言行方面注意一点。大家虽然不是做科学研究的,但必要的修养应该有的。做任何事情都应该实事求是,而不轻浮。还有就是适当的肚量,敢于接受其它事物,相信这些话对你今后一生都是有帮助的。如果LZ对以上话并不感冒,就当我没说。另外我那个计算长度的算法确实有不小的误差,我已经写出更精确的方法,只是最近太忙,来不及整理。我将在稍后给出答案。
      

  15.   

    楼主在那个帖子中用的是 JDK 内置的 BigInteger,这个类自 JDK 1.1 就已经存在了,至今已经有 13 年的历史了,期间不知经过多少次的修改和优化。而 53 楼 Snowdust 在 C# 的帖子中的代码都是自行实现的,因此两者没有可比性。很不希望看到 Java 版的跑到其他版块去说其他语言的劣势,这是一位程序员不应有的素质。大家可能都不是这些语言的发明者,因此没有任何资格对这些语言说三道四!
      

  16.   

    好吧,俺来总结一下,然后结贴了。俺说过“C#的确很烂”,然后又说“俺没有鄙视过C#”,这话前后矛盾,俺错了。
    俺的本意是,经过优化的N!算法,和考虑到通用性,所以效率并不高的BigInteger相比,差了很多,所以俺的结论是C#慢。这里不同意火龙果的说法,BigInteger的确经过了10多年的改造,非常完善。但是我的程序却非常粗糙,根本没考虑过为了阶乘进行优化。所以其效率真的很慢,每次new一个object就要花费很多时间。然后,俺的确不熟C#,所以自己没有资格鄙视C#。但是的确是有人认为自己被鄙视的。
    比方说我就不知道C#里面有没有类似BigInteger的类,有的话,用C#的BigInteger实现的阶乘和自行实现的阶乘效率哪个更快?如果用自行实现的更快的话(我相信他的程序是快的),说明C#本身是慢的。“做任何事情都应该实事求是,而不轻浮。还有就是适当的肚量,敢于接受其它事物,相信这些话对你今后一生都是有帮助的。”这话我原文奉还。在我看来,聊技术问题的时候,说什么“轻浮”,“肚量”,“人生”的人
    恰恰是不“实事求是”,扯东扯西。关于“已经写出更精确的方法”,本来就在火龙果给出近似的斯特林公式值钱,我已经把源码给出了。
    再用斯特林公式去推一下就没有任何意义了。倒是不妨用更精确的那个不是“约等于”的那个公式试试。