0

「Runnable jar」を開始するとき、デフォルトではコンソールは開始されません。ターミナルを起動する場合は、コマンド プロンプト (Windows ユーザーの場合) で "java -jar nameofyourprogram.jar" を実行すると、コンソールが表示されます。

私の質問は、コンソールが表示されず、情報をコンソールに出力する場合に System.out.println() を使用すると、それでも出力されますか? プログラムの速度がまったく低下しますか(多くのprintステートメントの場合)

当然のことながら、GUI を使用すると、上記のコマンドを実行しない限り、コンソールが読み込まれません。したがって、多くの print ステートメントがある場合でも、プログラムの速度に影響し、印刷されますか? (ターミナル/コンソールが表示されていないにもかかわらず)

4

2 に答える 2

1
does it slow down your program at all (for lots of print statements)

はい、手動でテストできますSystem.nanoTime();

注:System.currentTimeMillis()実行時間をチェックするために人々が使用するのを見てきましたが、これは正しい方法ではありません。System.nanoTime();実行時間の確認に使用します。

System.currentTimeMillis()メソッドを使用して実装されます。このGetSystemTimeAsFileTimeメソッドは、基本的に、Windows が保持する低解像度の時刻値を読み取るだけです。このグローバル変数の読み取りは当然非常に高速で、報告された情報によると約 6 サイクルです。この時刻の値は、タイマー割り込みがどのようにプログラムされているかに関係なく、一定の速度で更新されます。プラットフォームに応じて、これは 10ms または 15ms になります (この値はデフォルトの割り込み期間に関連付けられているようです)。

System.nanoTime()QueryPerformanceCounter/ QueryPerformanceFrequencyAPIを使用して実装されます (利用可能な場合、それ以外の場合は を返しますcurrentTimeMillis*10^6)。QueryPerformanceCounter(QPC) は、実行しているハードウェアに応じてさまざまな方法で実装されます。通常、プログラマブル インターバル タイマー (PIT)、ACPI 電源管理タイマー (PMT)、または CPU レベルのタイムスタンプ カウンター (TSC) のいずれかを使用します。PIT/PMT にアクセスするには、低速の I/O ポート命令を実行する必要があり、その結果、QPC の実行時間はマイクロ秒単位になります。対照的に、TSC の読み取りは 100 クロック サイクルのオーダーです (チップから TSC を読み取り、それを動作周波数に基づく時間値に変換するため)。システムが ACPI PMT を使用しているかどうかは、QueryPerformanceFrequency が 3,579,545 (つまり 3.57MHz) の署名値を返すかどうかを確認することでわかります。1.19Mhz 付近の値が表示される場合、システムは古い 8245 PIT チップを使用しています。

于 2013-10-05T07:05:02.230 に答える
1

当然のことながら、GUI を使用すると、上記のコマンドを実行しない限り、コンソールがロードされません。したがって、多くの print ステートメントがある場合でも、プログラムの速度に影響し、印刷されますか?

パフォーマンスに関する質問に対する最善の答えは、テストすることです。簡単なサンプル プログラムを次に示します。

import java.io.*;

class Test {

    public static void main(String[] args) throws Exception {
        // Untimed, for the sake of JIT compilation
        for (int i = 0; i < 100000; i++) {
            System.out.println("Foo");
        }
        // Now let's time it.
        long start = System.nanoTime();
        for (int i = 0; i < 100000; i++) {
            System.out.println("Foo");
        }
        long end = System.nanoTime();
        String outputPath = "c:\\users\\jon\\test\\results.txt";
        try (FileWriter writer = new FileWriter(outputPath)) {
            writer.write((end - start) + " nanoseconds");
        }
    }
}

これをコンソールから実行して非表示にすると、ラップトップで 5604097078 ナノ秒の結果が得られます。

Windows エクスプローラーから実行すると、出力がないため、3339245234 ナノ秒の結果が得られます。(明らかに、私はそれを数回実行しました - これらは単なる典型的な結果です。)したがって、実際には何もしていないコンソールに書き込む方がはるかに効率的ですが、無料にはほど遠いです. アプリケーションの問題かどうかは別の問題です。

いいえ、私が知る限り、出力は実際にはどこにも書かれていません。これをログに使用している場合は、専用のログ パッケージを使用することをお勧めします。これにより、より効率的な no-op ログを無効にすることができ、特定のファイルまたは任意の場所にログを記録することもできます。欲しいです。

于 2013-10-05T07:18:55.480 に答える