我在windows中通过eclipse运行下面的代码,然后在Unix中作为独立的java运行。
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中:
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中:
jre 1.6.0_26这里我漏掉了什么?有什么建议可以提高unix的性能吗?
发布于 2012-05-04 22:42:57
为了解决这个问题,你可以做两件具体的事情:
发布于 2012-05-04 22:40:58
在不同的平台上发现这样的差异并不是那么令人震惊。要知道,虽然字节码是相同的,但JVM是特定于平台的。
在许多这样的领域,你的代码在一个平台上运行良好,但在另一个平台上却失败了。我遇到的一个例子是使用文件拖放,其中unix (至少ubuntu)使用与windows不同的数据风格来拖放文件。
您必须在要在其中运行代码的所有平台上进行测试
此外,在您的特定情况下,您应该尝试更有效地从输入流读取(使用byte[]),或者创建一个BufferedInputStream来包装您的FileInputStream
发布于 2012-05-04 22:43:43
您还必须在使用的不同JVM之间有所不同。例如,在*nix系统上,有像"icedtea“或"OpenJDK”这样的vms被广泛使用(因为它们是默认安装)。
https://stackoverflow.com/questions/10450932
复制相似问题