重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

プログラムの処理の速度について聞かせてください。

/*SpeedTest*/

import java.io.*;

public class SpeedTest{

public static String St(){

String fname = "hello.txt";

try{
BufferedReader br = new BufferedReader(new FileReader(fname));

String str = br.readLine();

}catch (Exception e){
e.printStackTrace();
}
return "";
}


public static void main(String[] args){

long s = System.currentTimeMillis();
for(int t = 0; t < 50; t++){
SpeedTest.St();
}
long g = System.currentTimeMillis();
System.out.println(( g - s ) + " ms." );
}
}

のプログラムを、コマンドプロンプトで実行すると、「900 ms」なのに対して、JBuilderでは、「100 ms」です。
もちろん、同じマシン上で、J2SDKも同じ、1.4.0です。
なぜ、これほどに処理が違ってくるのでしょうか・・?

環境は、win2kです。
JVM関係なのでしょうか?

A 回答 (4件)

少し調べてみました。


下記のリンクが大凡の説明になると思います。

で、問題はこの部分だと思われます。

>%SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem;c:\j2sdk1.4.1_03\bin

この環境設定では、j2sdk1.4.1_03\bin\java.exe を参照しているつもりでも、実際は C:\Windows\system32\java.exe を呼び出してしまっているということなのだと思います。
そして C:\Windows\system32\java.exe の参照先が(デフォルトでは)C:\Program Files\java\j2re1.4.1 となっているために 1.4.1-b21VMで実行されるという結果になるのだと思います。
対処法としてレジストリの設定を変更するというやり方がありますが、レジストリをいじるのは余り気持ちの良いものではないでしょうから(笑)別の方法として、環境変数の順番を入れ替えるというのはどうでしょうか?
%SystemRoot%\system32; よりも c:\j2sdk1.4.1_03\bin を前に持ってくるわけです。
これで恐らくプロンプト上でも、1.4.1_03-b2VM で実行されるようになるかと思います。

注)変更する場合には、くれぐれも自己責任の範囲でお願いします。

参考URL:http://java.sun.com/j2se/1.4.1/ja/runtime_win32. …
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

今回は、処理速度の異変のことだけでなく、対処法まで、回答いただきありがとうございました。

そして、何より、1.4.1-b21 が 1.2 よりも処理が遅いって事がわかり、重要な情報を教えていただき、自分の中では、これからの開発に役立てたいと思います。

その上、takaP-さんが、使ってない、JBuilder のことでの質問も答えていただきありがとうございました。
遅れましたが、今回、使っている JBuilder のバージョンは、JBuilder8 です。

本当に、今回は、長期に渡って、回答いただきありがとうございました。

お礼日時:2003/10/17 15:28

やはり「1.4.1-b21」でしたか・笑


これ遥か昔の1.2よりも処理が遅いんですよ。バグではないかもしれないですけど、それに準ずる不良品VMですわなぁ。

>●自分は、プロンプト上とJBuilderと同じ JDK(1.4.1_03-b2)を使っていると思っていたのに、プロンプト上では、わざわざ、JBuilder 既存の JDK が使われている。

私はJBuilderは使ってませんのでなんとも答えようがないのですが、IDEってのは特定バージョンの実行環境(この場合JREのバージョン)に絞って開発されている事が往々にしてありますから、指定のバージョン以外では動かない可能性が在るわけです。
ですから、強制的にインストール時に実行環境を書きかえるといった事は有り得る話しでしょうね。
もし異なるバージョンで実行したいのならば環境変数を書き直すか、プロンプトで c:\j2sdk1.*.*\bin\java とVMを直接指定して実行するかでしょう。
特に問題がなければそのままJBuilderが設定した環境のままで使用するのが安全なのかもしれません。
それか、JBuilderを捨てるとか・w

>●Javaでの開発者のみなさんは、これらの事を知っていて、処理の速い?JDK のバージョンを使っている。

それはどうか分かりません。知っているかどうかはその人次第でしょう。
で、処理の速い物を使うのかどうかですけど、これって開発の本質とは直接は関係ないような気がします。
開発者が幾ら速いVMを使って実行していたとしても、アプリケーションを使用する側が同じく速い実行環境である保証はないわけですし、その逆も然りです。
もちろん、Webアプリ等の環境構築をする場合には、各VMの実行速度の違いなどを調べて最良の選択をする必要はあるでしょうけどね。
で、開発者側がすべき事は速いVMを使って開発する事ではなくて、各VMでの検証ができる時間と環境を持つことだと思います。
ですから「1.4.1-b21 は上記のようなコード処理が遅い」という知識を得た事は重要ですが、だからといって開発者側の実行環境を直ぐに替えなければいけないということに直結する問題ではない気がしますし、IDEとの兼ね合いを考慮すると、特に問題なければいじらない方が無難ではないかと思います。

この回答への補足

わかりやすい、何度も丁寧な回答ありがとうございます。

何度も補足質問しまして、本筋とは離れてしまいましたが、お時間があったら、教えてください。

>「1.4.1-b21 は上記のようなコード処理が遅い」
と言う事は、今回のファイルから読み込むようなコードでは、「処理が遅い」と結果が出ましたが、他の場面では、1.4.1_03と同じ処理速度を出すと言うようなこともあるのですか?

>c:\j2sdk1.*.*\bin\java
は、実装した結果、実行できて、自分の思う値が取得できました。
しかし、「環境変数を書き直す」で、今の環境変数を見ると、(全て記載すると)
%SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem;c:\j2sdk1.4.1_03\bin
と、1.4.1_03 を使っている状態なのですが、やはり、JBuilder 側でうまく、JBuilder既存の(1.4.1-b21 )ものに実装されているのでしょうか?
takaP-さんは、JBuilder を使われてないので、質問するのは、間違いとも思うのですが・・・。

結論は、JBuilder を落としてしまえば(バージョンの変更等も)、一番の解決策ですかね・・?(笑

JBuilder のことばかり聞いてすみません・・・。

補足日時:2003/10/13 17:05
    • good
    • 0

先程、手元に在るSDKの全てのバージョンで調べてみたんですが、かなりJREのバージョン間で処理速度に違いがありました(約10倍の速度差です


やはり実行しているランタイムが異なっている可能性が高いのではないでしょうかね?
試しに、java.lang.System#getProperty()で、java.versionかjava.vm.versionを調べてみてはどうでしょうか。
上のソースですと。。。

System.out.println(( g - s ) + " ms." );
//↓これを追加
System.out.println(System.getProperty("java.vm.version"));
}

としてみて再コンパイルし、JBuilderとプロンプトで出力文字の比較をしてみて下さい。

この回答への補足

回答、ありがとうございます。
結果からいくと、やはり JDK のバージョンが違ってました。(※訂正です。一番最初の質問で1.4.0と書きましたが、1.4.1_03です。)

そして、状況を書きます。

コマンドプロンプトでの実行結果
900 ms
1.4.1-b21

JBuilderでの実行結果
100 ms
1.4.1_03-b2
です。

○まず、コマンドプロンプトでの実行なのですが、
この 1.4.1-b21 は、JBuilder 既存の JDK を使って実行されています。 それは、なぜ、分かったかと言いますと、前回の補足で説明した様に、「JDK 設定」でデフォルトで設定されていたからです。

○そして、JBuilder は、自分が思った通りで、自分自身がダウンロード、インストールした、1.4.1_03-b2 です。

そこで、今、起きている思いの違いは・・・
●自分は、プロンプト上とJBuilderと同じ JDK(1.4.1_03-b2)を使っていると思っていたのに、プロンプト上では、わざわざ、JBuilder 既存の JDK が使われている。
●Javaでの開発者のみなさんは、これらの事を知っていて、処理の速い?JDK のバージョンを使っている。

です。
これは、環境変数の設定辺りも関係してくるのでしょうか? それとも、JBuilder をインストールした時点で、マシン上では、JBuilder 既存の JDK を使うように書き換えられるのでしょうか・・・?
いや、書き換えられると仮定すると、今回の問題が全て解決するような・・・。

またの回答よろしくお願いします。

補足日時:2003/10/11 16:37
    • good
    • 0

どちらも同じクラスファイルの実行なのですか?


でしたら、ちょっと常識では考えられない結果ですね。
JITをoffにしたとしてもこれは有り得ないと思います。
hello.txtが無い状態でコマンドライン実行してるとか
ってオチではないですよね(笑

出来れば、もうすこし補足願えますでしょうか。
(コンパイル辺りとか)

この回答への補足

早い回答ありがとうございます。
まず、最初に、指摘を貰った、「hello.txt が無い状態」なのですが、
これは、確認しました。
と言うのも、確認の確認のために、わざとhello.txt を削除して、実行を掛けてみました。
すると、
java.io.FileNotFoundException: c:\hello.txt (指定されたファイルが見つかりません。)
が吐き出されます。もちろん、50回です。
そして、コンパイルなのですが、コマンドプロンプトでは、

C:\>javac SpeedTest.java

C:\>java SpeedTest

です。
JBuilder では、「ツール」→「JDKの設定」→「変更」で、コマンドプロンプトと
同じ環境にするために、設定しなおしました。
他は、デフォルトです。
まだ、JBuilder に慣れてないため、確認で書くのですが、コンパイルする時には、
「プロジェクト」→「再ビルド"SpeedTest"」としました。
そして、実行は、「実行」→「デフォルト実行時設定を使って"SpeedTest"を実行」
の手順です。

自分でも、「自分自身のミス!」だと思って、何度も見直してるのですが、
結果、同じ値をはじき出します・・・。

またの指摘よろしくお願いします。

補足日時:2003/10/11 03:45
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!