NET真的一定比JAVA快吗?

来源:互联网 发布:mac开机选择系统 编辑:程序博客网 时间:2024/06/09 14:25

我不记得我是在哪篇文章上看过,说在Windows上.net的速度一定会比Java写的程序快.但是没留心过,也以为肯定是这样的.刚好这几天研究.net上的StringBuilder,准备和Java的StringBuffer比较以下速度的时候,突然发现JDK5.0中居然也多出个StringBuilder类出来,呵呵.于是给它们3个都进行了次比较.
因为考虑JIT的影响所以取了10次时间差再取平均值来比较.

 

先看看它们3个在各自的文档中如何定义的:

.net StringBuilder

String 对象是不可改变的。每次使用 System.String 类中的方法之一时,都要在内存中创建一个新的字符串对象,这就需要为该新对象分配新的空间。在需要对字符串执行重复修改的情况下,与创建新的 String 对象相关的系统开销可能会非常昂贵。如果要修改字符串而不创建新的对象,则可以使用 System.Text.StringBuilder 类。例如,当在一个循环中将许多字符串连接在一起时,使用 StringBuilder 类可以提升性能。

java StringBuilder

一个可变的字符序列。此类提供一个与 StringBuffer 兼容的 API,但不保证同步。该类被设计用作 StringBuffer 的一个简易替换,用在字符串缓冲区被单个线程使用的时候(这种情况很普遍)。如果可能,建议优先采用该类,因为在大多数实现中,它比 StringBuffer 要快。

java StringBuffer

线程安全的可变字符序列。一个类似于 String 的字符串缓冲区,但不能修改。虽然在任意时间点上它都包含某种特定的字符序列,但通过某些方法调用可以改变该序列的长度和内容。

java和.net用的分别是Date与DateTime来获得时间差,所以这2个类的关键方法在这也有必要提到一下

java Date.getTime()

getTime

public long getTime()
返回自 1970 年 1 月 1 日 00:00:00 GMT 以来此 Date 对象表示的毫秒数。

返回:
自 1970 年 1 月 1 日 00:00:00 GMT 以来此日期表示的毫秒数。

.net DateTime.Ticks

public long Ticks {get;}属性值

表示此实例的日期和时间的刻度数。该值介于 MinValueMaxValue 之间。

备注

此属性的值为自 0001 年 1 月 1 日午夜 12:00 以来所经过时间以 100 毫微秒为间隔表示时的数字。


好了一返回的是毫秒一个返回的是微妙,所以知道毫秒与微妙之间的转化也是有必要的
1秒=1000毫秒(ms) 1毫秒=1/1,000秒(s)
1秒=1,000,000 微秒(μs) 1微秒=1/1,000,000秒(s)
1秒=1,000,000,000 纳秒(ns)
1纳秒=1/1,000,000,000秒(s)
1秒=1,000,000,000,000 皮秒(ps)

String 对象是不可改变的。每次使用 System.String 类中的方法之一时,都要在内存中创建一个新的字符串对象,这就需要为该新对象分配新的空间。在需要对字符串执行重复修改的情况下,与创建新的 String 对象相关的系统开销可能会非常昂贵。如果要修改字符串而不创建新的对象,则可以使用 System.Text.StringBuilder 类。例如,当在一个循环中将许多字符串连接在一起时,使用 StringBuilder 类可以提升性能。

java StringBuilder

一个可变的字符序列。此类提供一个与 StringBuffer 兼容的 API,但不保证同步。该类被设计用作 StringBuffer 的一个简易替换,用在字符串缓冲区被单个线程使用的时候(这种情况很普遍)。如果可能,建议优先采用该类,因为在大多数实现中,它比 StringBuffer 要快。

java StringBuffer

线程安全的可变字符序列。一个类似于 String 的字符串缓冲区,但不能修改。虽然在任意时间点上它都包含某种特定的字符序列,但通过某些方法调用可以改变该序列的长度和内容。

java和.net用的分别是Date与DateTime来获得时间差,所以这2个类的关键方法在这也有必要提到一下

java Date.getTime()

getTime

public long getTime()
返回自 1970 年 1 月 1 日 00:00:00 GMT 以来此 Date 对象表示的毫秒数。

返回:
自 1970 年 1 月 1 日 00:00:00 GMT 以来此日期表示的毫秒数。

.net DateTime.Ticks

public long Ticks {get;}属性值

表示此实例的日期和时间的刻度数。该值介于 MinValueMaxValue 之间。

备注

此属性的值为自 0001 年 1 月 1 日午夜 12:00 以来所经过时间以 100 毫微秒为间隔表示时的数字。


好了一返回的是毫秒一个返回的是微妙,所以知道毫秒与微妙之间的转化也是有必要的
1秒=1000毫秒(ms) 1毫秒=1/1,000秒(s)
1秒=1,000,000 微秒(μs) 1微秒=1/1,000,000秒(s)
1秒=1,000,000,000 纳秒(ns)
1纳秒=1/1,000,000,000秒(s)
1秒=1,000,000,000,000 皮秒(ps)

C#程序:返回的时间是毫秒

using System;
using System.Text; 
 class Class1{ 
  public static void Main(string[] args) {   
   
   StringBuilder s=new StringBuilder();
   double[] tosum=new double[10];
   DateTime d1=new DateTime();
   DateTime d2=new DateTime();
   for (int j=0;j<=9;j++)
   {
    d1=DateTime.Now;
    for (int i=0;i<=40000;i++)
     s.Append("Append");
    d2=DateTime.Now;
    tosum[j]=d2.Ticks -d1.Ticks;
   }
   
   double sum=0;
   for (int j=0;j<=9;j++)
   {
    sum=sum+tosum[j];    
   }
  
   Console.WriteLine("StringBuilder消耗的时间:"+sum/100); //取平均值与转化单位
   }
 }

结果:

 

java程序 :返回毫秒

import java.util.*;
class EString { 
   public static void main(java.lang.String[] args) { 
   
   
   StringBuilder s=new StringBuilder();
   double[] tosum=new double[10];    
   
   for (int j=0;j<=9;j++){
    Date d1=new Date();
    for (int i=0;i<=40000;i++)
     s.append("Append");
    Date d2=new Date();
    tosum[j]=d2.getTime()-d1.getTime();
   }
   
   double sum=0;
   for (int j=0;j<=9;j++){
    sum=sum+tosum[j];    
   }
  
   System.out.println("StringBuilder消耗的时间:"+sum/10);  
   
  
   
   StringBuffer sb1=new StringBuffer(); 
   for (int j=0;j<=9;j++){
    Date test1=new Date();   
    for (int i=0;i<=40000;i++)
     sb1.append("Append");
    Date test2=new Date();   
    tosum[j]=test2.getTime()-test1.getTime();
   }
   
   sum=0;
   for (int j=0;j<=9;j++){
    sum=sum+tosum[j];    
   }
  
   System.out.println("StringBuffer消耗的时间:"+sum/10);
   }
}

 

结果:

对于这样的结果。我不想在说什么了……

原创粉丝点击