1

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 のファイルです。
Windowsobj = in.readObject();では、4 ~ 5 秒かかります。
しかし、Unixobj = 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 でのパフォーマンスを改善するための提案はありますか?

4

3 に答える 3

0

プラットフォーム間でこのような違いを見つけるのは、それほど衝撃的ではありません。バイトコードは同じですが、JVMはプラットフォーム固有であることを理解してください。

このような領域がいくつかあり、あるプラットフォームでは完全に機能し、別のプラットフォームでは失敗するコードがあります。私が遭遇した1つのケースは、ファイルをドラッグアンドドロップすることでした。unix(少なくともubuntu)は、Windowsとは異なるデータフレーバーのファイルをドロップします。

コードを実行する予定のすべてのプラットフォームでテストする必要があります

また、特定のケースでは、inputstreamからより効率的に読み取るか(byte []を使用)、BufferedInputStreamを作成してFileInputStreamをラップする必要があります。

于 2012-05-04T14:40:57.723 に答える
0

これを理解するためにできる具体的なことは次の 2 つです。

  1. Unix では、ファイルがネットワーク マウントではなく、ローカル ファイル システムにあることを確認してください。
  2. プロファイラー ( YourKitなど) を使用して、どこで時間が費やされているかを調べます。
于 2012-05-04T14:42:57.007 に答える
0

また、使用するさまざまな JVM を区別する必要があります。たとえば、* nix システムでは、「icedtea」や「OpenJDK」などの VM が広く使用されています (これらがデフォルトのインストールであるため)。

于 2012-05-04T14:43:43.293 に答える