首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >运行相同Java代码的Windows与Unix的性能差异

运行相同Java代码的Windows与Unix的性能差异
EN

Stack Overflow用户
提问于 2012-05-04 22:35:47
回答 3查看 1.2K关注 0票数 1

我在windows中通过eclipse运行下面的代码,然后在Unix中作为独立的java运行。

代码语言:javascript
复制
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.sql.SQLException;
import java.text.ParseException;

public class readObjectBoeing {



/**
 * @param args
 * @throws ParseException 
 * @throws SQLException 
 */
public static void main(String[] args) {
    //File file = new File("/opt/app/d1ebp1m1/dv01/Vibhor/test/00017741_repository.dat");
    File file = new File("C:/_Vibhor/00017741_repository.dat");
    InputStream is;
    try {
        is = new FileInputStream(file);
        byte[] b = toByteArray(is);//read from file;
        Object o1 =null;
        o1 = convertByteArrayToObject(b);
    } catch (FileNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

}
public static Object convertByteArrayToObject(byte[] buf) throws Exception 
{

    if (buf.length == 0)
    {
        return null;
    }
    long startTime = -1;
    long step1=-1,step2=-1;
    Object                  obj = null;
    ByteArrayInputStream    bis = null;
    ObjectInputStream       in  = null;
    try 
    {   
        bis = new ByteArrayInputStream(buf);
        in  = new ObjectInputStream(bis);
        startTime = System.currentTimeMillis()/1000;
        obj = in.readObject();
        step1 = System.currentTimeMillis()/1000 - startTime ;
        System.out.println("in.readObject()!! :  " + step1);
    } 
    catch (Exception e) 
    {
        throw e;
    } 
    finally 
    {
        if (in != null) 
        {
            in.close();
        }
        if (bis != null) 
        {
            bis.close();
        }
        in  = null;
        bis = null;
    }

    return obj;
}
public static byte[] toByteArray(InputStream input) throws IOException
{
    ByteArrayOutputStream output = new ByteArrayOutputStream();
    long count = 0L;
    byte[] buffer =new byte[4096];
    for(int n = 0; -1 != (n = input.read(buffer));){
        output.write(buffer, 0, n);
        count += n;
    }
    return output.toByteArray();
}

}

00017741_repository.dat -它是57Mb的文件。

在windows obj = in.readObject();中-我需要4-5秒。

但在Unix obj = in.readObject();中,我需要19 - 25秒!

我在这两种情况下都使用VM args -Xmx512m来执行。

在unix中:

代码语言:javascript
复制
java version "1.6.0_29"
Java(TM) SE Runtime Environment (build 1.6.0_29-b11)
Java HotSpot(TM) Server VM (build 20.4-b02, mixed mode)

在Windows中:

代码语言:javascript
复制
jre 1.6.0_26

这里我漏掉了什么?有什么建议可以提高unix的性能吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-05-04 22:42:57

为了解决这个问题,你可以做两件具体的事情:

  1. 确保Unix上的文件驻留在本地文件系统上,而不是网络挂载上;
  2. 使用探查器(如YourKit)来找出时间花在哪里。
票数 0
EN

Stack Overflow用户

发布于 2012-05-04 22:40:58

在不同的平台上发现这样的差异并不是那么令人震惊。要知道,虽然字节码是相同的,但JVM是特定于平台的。

在许多这样的领域,你的代码在一个平台上运行良好,但在另一个平台上却失败了。我遇到的一个例子是使用文件拖放,其中unix (至少ubuntu)使用与windows不同的数据风格来拖放文件。

您必须在要在其中运行代码的所有平台上进行测试

此外,在您的特定情况下,您应该尝试更有效地从输入流读取(使用byte[]),或者创建一个BufferedInputStream来包装您的FileInputStream

票数 0
EN

Stack Overflow用户

发布于 2012-05-04 22:43:43

您还必须在使用的不同JVM之间有所不同。例如,在*nix系统上,有像"icedtea“或"OpenJDK”这样的vms被广泛使用(因为它们是默认安装)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10450932

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档