RT
下面是相同“循环热点”的Java 和 C#代码,为本程序测试了20多次,都是在彼此互不干扰的环境下(不同时开)
Java比C#耗时每次都少, 平均起来少33.34秒Java结果打印:
13:41:35:718
13:43:3:609
耗时:88秒C#结果打印:
13:41:29:218
13:43:25:203
耗时:116秒下面是Java代码import java.util.*;public class Myexe { public static int subCld(Calendar cld1, Calendar cld2) {
int msec = 0; msec = (cld1.get(Calendar.HOUR_OF_DAY) - cld2.get(Calendar.HOUR_OF_DAY)) * 3600;
msec += (cld1.get(Calendar.MINUTE) - cld2.get(Calendar.MINUTE)) * 60;
msec += cld1.get(Calendar.SECOND) - cld2.get(Calendar.SECOND); return msec;
} public static void main(String[] args) {
Calendar cld1 = Calendar.getInstance();
System.out.println(cld1.get(Calendar.HOUR_OF_DAY) + ":"
+ cld1.get(Calendar.MINUTE) + ":" + cld1.get(Calendar.SECOND) + ":"
+ cld1.get(Calendar.MILLISECOND));
for (int i = 0; i < 100000; i++)
for (int j = 0; j < 300000; j++)
;
Calendar cld2 = Calendar.getInstance();
System.out.println(cld2.get(Calendar.HOUR_OF_DAY) + ":"
+ cld2.get(Calendar.MINUTE) + ":" + cld2.get(Calendar.SECOND) + ":"
+ cld2.get(Calendar.MILLISECOND));
System.out.println("耗时:" + subCld(cld2, cld1) + "秒");
}}
下面是C#代码using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;namespace ConsoleApplication2 {
    class Program {
        public static int CalTime(int[] intarr1, int[] intarr2) {
            int sec;
            sec = (intarr1[0] - intarr2[0]) * 3600;
            sec += (intarr1[1] - intarr2[1]) * 60;
            sec += intarr1[2] - intarr2[2];
            return sec;
        }        static void Main(string[] args) {
            int[] ta1 = new int[3], ta2 = new int[3];
            ta1[0] = DateTime.Now.Hour;
            ta1[1] = DateTime.Now.Minute;
            ta1[2] = DateTime.Now.Second;
            Console.WriteLine(DateTime.Now.Hour + ":" + DateTime.Now.Minute + ":" + DateTime.Now.Second + ":" + DateTime.Now.Millisecond);
    for (int i = 0; i < 100000; i++)
                for (int j = 0; j < 300000; j++) 
                    ;
            Console.WriteLine(DateTime.Now.ToShortTimeString() + ":" + DateTime.Now.Second.ToString() + ":" +
                DateTime.Now.Millisecond.ToString());
            ta2[0] = DateTime.Now.Hour;
            ta2[1] = DateTime.Now.Minute;
            ta2[2] = DateTime.Now.Second;
            Console.WriteLine("耗时:" + CalTime(ta2, ta1) + "秒");
            Console.ReadKey(false);
        }
    }
}

解决方案 »

  1.   

    上面的是为了明显对比,Java程序比C#开的晚 可是结束的缺比C#早,有兴趣的朋友可以拿到自己机器上做下实验,都说C#快于Java,可是时间上并不见得啊,PS:我的是.net4.0上运行的C#,看来C#开始臃肿起来了,速度较3.5有明显的下降啊
      

  2.   

    我觉得语言之间的对比好像没多大的意义,刚在网上找到这么一段话:
    “C#并不被编译成为能够直接在计算机上执行的二进制本地代码。与Java类似,它被编译成为中间代码(Microsoft Intermediate Language),然后通过.NET Framework的虚拟机——被称之为通用语言运行庫(Common Language Runtime)——执行。所有的.Net编程语言都被编译成这种被称为MSIL(Microsoft Intermediate Language )的中间代码。因此虽然最终的程序在表面上仍然与传统意义上的可执行文件都具有“.exe”的后缀名。但是实际上,如果计算机上没有安装.Net Framework,那么这些程序将不能够被执行。在程序执行时,.Net Framework将中间代码翻译成为二进制机器码,从而使它得到正确的运行。最终的二进制代码被存储在一个缓冲区(Buffer)中。所以一旦程序使用了相同的代码,那么将会调用缓冲区中的版本。这样如果一个.Net程序第二次被运行,那么这种翻译不需要进行第二次,速度明显加快。
      

  3.   

    我测了20多次,每次都是Java快而且快很多呢,快了30多秒啊
      

  4.   

    听说.net CLR是先将中间代码完全编译成native代码再运行的,而SUN Java Hotspot VM是采用混合方式,解释+编译。如果这样的话,.net程序的启动时间可能比java程序的启动时间要长,主要是编译消耗。再加上程序本身比较简单,编译时间可能就占用了大部分,后面的性能比较其实就没有意义了。SUN将jvm划分为server版本和client版本的一个想法就是,client虚拟机启动的程序可能就运行一次结束了,如果启动时进行过多的编译,对用户来说是不友好的。 而server虚拟机,因为是服务器程序,一旦部署上之后,可以不断的运行,这时候启动时间相对而言就不重要了。
      

  5.   

    两个方法的实现你觉得是对等的吗?
    我没看出来。
    要比是要在同等条件下比,不要使用特性。
    在你上面的例子中
    public static int subCld(Calendar cld1, Calendar cld2) 
    public static int CalTime(int[] intarr1, int[] intarr2) 
    它们相等了吗?System.out.println(cld1.get(Calendar.HOUR_OF_DAY) + ":"
                    + cld1.get(Calendar.MINUTE) + ":" + cld1.get(Calendar.SECOND) + ":"
                    + cld1.get(Calendar.MILLISECOND));Console.WriteLine(DateTime.Now.Hour + ":" + DateTime.Now.Minute + ":" + DateTime.Now.Second + ":" + DateTime.Now.Millisecond);
    这两个相等了?
      

  6.   

    你开QQ,我开宝马,我开得比你快证明我技术比你好吗?
    比较的方法要专业一点。
    看我下面的一个例子:
    Java与C#执行效率之不科学比较
      

  7.   

    你的代码太臃肿了,看看我的代码吧。public class Counter {
    public static void main(String[] args)
    {
    long start=System.currentTimeMillis();
    for (int i = 0; i < 100000; i++)
                for (int j = 0; j < 300000; j++)
                    ;
    long end=System.currentTimeMillis();
    System.out.println("执行了"+(end-start)+"毫秒");
    }
    }using System;
    class Program
    {
        static void Main(string[] args)
    {
    DateTime start=DateTime.Now;
    for (int i = 0; i < 100000; i++)
    for (int j = 0; j < 300000; j++)
    ;
    DateTime end=DateTime.Now;
    TimeSpan ts=end-start;
    Console.WriteLine("执行了"+ts.TotalMilliseconds+"毫秒");
    }
    }
      

  8.   

    windows都在走下坡路了,干嘛还要学.net呢?
      

  9.   


    java更下坡了吧,都卖给oracle了
      

  10.   

    我不否认他们是否对等,但程序相差30多秒的原因绝对不是它们的不同,试想这2个函数不可能执行相差30秒,您说是吗,我故意把for里面的值设的很大就是为了消除者个副作用,如果把数值设的更大你会看见他们相差的更大,而此时除了for里面,其他的地方都是没有变化的。
      

  11.   

    抱歉再次引用您的另一段话
    “System.out.println(cld1.get(Calendar.HOUR_OF_DAY) + ":"
      + cld1.get(Calendar.MINUTE) + ":" + cld1.get(Calendar.SECOND) + ":"
      + cld1.get(Calendar.MILLISECOND));Console.WriteLine(DateTime.Now.Hour + ":" + DateTime.Now.Minute + ":" + DateTime.Now.Second + ":" + DateTime.Now.Millisecond);
    这两个相等了?”
    敢问哪个更快? 我倒觉得C#的这段代码更快 你说呢?可结果呢?这不反而说明C#for里面更慢??
      

  12.   


    不同意楼上说的,卖给oracle不能就说走下坡路了啊,找到新家可能才更有前途
      

  13.   


    +1,差异不在代码里,但是两个测试并不公平,没有比较相应的java参数能信息
      

  14.   

    Java 中 int 在 JVM 中是经过特殊优化过的,单纯的 int 运算非常快,下面这是用 GCC 和 JDK 1.6.0_10 的执行结果。F:\test>type test.c
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>int main(void) {
        long start, end;
        int i, j;
        start = clock();
        for(i = 0; i < 100000; i++) {
            for(j = 0; j < 300000; j++);
        }
        end = clock();
        printf("%.2f s\n", (end - start) / 1000.0);
        return 0;
    }F:\test>gcc -c test.cF:\test>gcc -otest.exe test.oF:\test>test
    99.89 sF:\test>type Test.java
    public class Test {
        public static void main(String[] args) {
            long t0, t1;
            t0 = System.currentTimeMillis();
            for(int i = 0; i < 100000; i++) {
                for(int j = 0; j < 300000; j++);
            }
            t1 = System.currentTimeMillis();
            System.out.printf("%.2f s%n", (t1 - t0) / 1000.0);
        }
    }F:\test>javac Test.javaF:\test>java Test
    18.76 s
      

  15.   

    我不知道你的 JRE 运行怎么比楼主的快那么多,我开始还以为循环次数写错了,后来看一下也没有错。总之,int 单纯大负荷运算的意义不太大。
      

  16.   

    不要在ide下运行,请在编译好后在本地命令行中运行测试
      

  17.   

    最大的问题java很容易被反编译
      

  18.   

    争来争去都不是中国开发的语言,外国人的技术
     java 和c#不相同的.
    java 的IDE工具没有MS的IDE工具好用.什么时候中国弄个d语言,或者e语言出来,而且大家在这里讨论才好.
      

  19.   

    MyEclipse 感觉很好用啊,VS2010太臃肿了。。
      

  20.   

    swing 的布局管理器就要搞个半天.
      

  21.   

    我现在想通了,反正都是外国人的技术,那管什么语言好坏优劣.用上就行了.
    其实说到快,你用c写出来的才快.
    高级语言都帮你封装的好好的. 那些操作cpu 和内存的指令集的才叫快.
    微软做的操作系统就让你左点点,右点点就搞定.
    他的软件也是这种. 跟j哥和微哥混那个都一样.
    一言难尽.