加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

基准测试和c#与java之间差异的原因

发布时间:2020-12-14 19:13:12 所属栏目:Java 来源:网络整理
导读:我有一个令人费解的情况,我需要一个专家意见,以解释下面解释的现象的原因.几周前,我进行了一次名为“Java开发人员概述”的会议,作为其中的一部分,我编写了一个快速类C#(3.5框架)来从文件中读取并逐行写入另一个文件(在迭代中).由于我的观众是java开发人员,我

我有一个令人费解的情况,我需要一个专家意见,以解释下面解释的现象的原因.几周前,我进行了一次名为“Java开发人员概述”的会议,作为其中的一部分,我编写了一个快速类C#(3.5框架)来从文件中读取并逐行写入另一个文件(在迭代中).由于我的观众是java开发人员,我在java类中使用相同的代码进行并排比较.但是,当我在同一台机器上运行这些类时,令我惊讶的是,java代码的运行速度始终是C#代码的两倍.我已尝试在C#代码中进行许多优化以缩小差距,但无法成功.必须有一个解释,我正在寻找可以解释原因的人.我附上了两个类的源代码供您参考.

Java类

    public class ReadWriteTextFile {

    static public String getContents(File aFile,String OutPutFileName) {
    StringBuilder contents = new StringBuilder();

    try {
      BufferedReader input =  new BufferedReader(new FileReader(aFile));
      FileReader x = new FileReader(aFile);
      try {
        String line = null;
        while (( line = input.readLine()) != null){
              setContents(OutPutFileName,line + System.getProperty("line.separator"));
        }
      }
      finally {
        input.close();
      }
    }
    catch (IOException ex){
      ex.printStackTrace();
    }

    return contents.toString();
    }

  static public void setContents(String FileName,String aContents)
                                 throws FileNotFoundException,IOException { 
    try {
        FileWriter fstream = new FileWriter(FileName,true);
        BufferedWriter out = new BufferedWriter(fstream);
        out.write(aContents);
             out.close();
    } catch (Exception xe) {
        xe.printStackTrace();
    }
  }
  public static void main (String[] aArguments) throws IOException {

    System.out.println(getDateTime() + ": Started");
    File testFile = new File("C:tempblah.txt");
         String testFile2 = "C:tempblahblah.txt";

    for(int i=0; i<100; i++){
         getContents(testFile,testFile2);
     }

    System.out.println(getDateTime() + ": Ended");

  }

  private synchronized static String getDateTime() {
        DateFormat dateFormat = new SimpleDateFormat(
                                        "yyyy/MM/dd HH:mm:ss");
        Date date = new Date();
        return dateFormat.format(date);
    }
}

C#类

class ReadWriteTextFile
{
    static void Main(string[] args)
    {
        System.Diagnostics.Trace.WriteLine(getDateTime() + ": Started");
        String testFile = "C:tempblah.txt";
        String testFile2 = "C:tempblahblah.txt";
        for(int i=0; i<100; i++){
            getContents(testFile,testFile2);
        }
        System.Diagnostics.Trace.WriteLine(getDateTime() + ": Ended");
    }

    static public void getContents(String sourceFile,String targetFile) {      
        try {
            using (StreamReader r = File.OpenText(sourceFile))
            {
                String line;
                while ((line = r.ReadLine()) != null)
                {
                    setContents(targetFile,line);
                }
                r.Close();
            }
    }
    catch (IOException ex){
        Console.WriteLine(ex.StackTrace);
    }
  }

  static public void setContents(String targetFile,String aContents)
  {

    try {
        //FileStream fsO = new FileStream(targetFile,FileMode.Append);
        //StreamWriter w = new StreamWriter(fsO);
        FileStream fs = new FileStream(targetFile,FileMode.Append,FileAccess.Write,FileShare.None);
        using (StreamWriter w = new StreamWriter(fs))
        {
            w.WriteLine(aContents + "n");
        }
    } catch (Exception xe) {
        Console.WriteLine(xe.StackTrace);
    }
  }

  private static String getDateTime() {
      DateTime dt = DateTime.Now;
      return dt.ToString("yyyy/MM/dd HH:mm:ss");
   }
}
最佳答案
首先,在Java中,您使用的是平台的默认编码.这可能是一个固定的“每字符单字节”编码,这显然比使用UTF-8简单,而.NET默认使用UTF-8.

此外,您在.NET中编写了两个换行符,而在Java中只编写了一个换行符.

要检查的一件事是你是CPU绑定还是IO绑定.我希望这是IO限制,但我现在肯定感到惊讶.

最后,您应该在重新启动后运行每个测试,以尽可能地尝试从等式中删除磁盘缓存.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读