1

Apache HttpClient 4.1 を使用して単純な 1 スレッド ループを作成しました。localhost の Apache httpd Web サーバーに接続します。

リクエスト/レスポンスあたり平均 2.5 ミリ秒です。一方、JMeter は平均 1 ミリ秒です。(Apache Benchmark ab は 0.4ms で実行しますが、これはネイティブ コードであるため、おそらく比較の対象にはなりません。)

コードは次のとおりです。

    final HttpGet httpGet = new HttpGet(testUrl);
    while (true) {
        try {
            final long startNanoTime = System.nanoTime();
            final HttpResponse httpResponse = httpClient.execute(httpGet); 
            final InputStream inputStream = httpResponse.getEntity().getContent();

            final byte[] buffer = new byte[8192];
            int size = inputStream.read(buffer);
            while (size > 0) {
                size = inputStream.read(buffer);
            }

                            // Elapsed time measured here
            final long elapsed = System.nanoTime() - startNanoTime;

            inputStream.close();

        } catch (MalformedURLException e) {
            // Should never happen
            throw new RuntimeException(e);
        } catch (IOException e) {
            // Count
            errors++;
            throw new RuntimeException(e);
        }
    }
4

1 に答える 1

2

私のテストでは、それ以外の場合が示されています。たとえば、stackoverflow.com GET リクエストを 10 回以上繰り返します。 ここに画像の説明を入力

画像からわかるように (または見えない場合もあります)、jmeter を で使用した場合の平均時間は 712 ミリ秒View Results in a Tableです。このリスナーは、リクエストの統計情報だけを出力するのではなく、レスポンスの本文を出力することに注意してください。

そして、ここにJavaからの私のコードがあります:

public static void main(String[] args) throws Exception{        
        long totalTimeMS = 0;

        for (int i = 0; i < 10; i++) {

        long startTime = System.currentTimeMillis();


        HttpGet get = new HttpGet("http://stackoverflow.com");
        HttpClient client = new DefaultHttpClient();
        client.execute(get);       

        long endTime = System.currentTimeMillis();
        long duration = (endTime-startTime);
        totalTimeMS +=duration;
        System.out.format("Duration %d ms\n", duration);
        }

        System.out.format("Average time is %d ms", (totalTimeMS/10));
    }

そのため、レスポンスボディも気にしません。しかし、ここに結果があります(はるかに高速です):

Duration 615 ms
Duration 263 ms
Duration 264 ms
Duration 262 ms
Duration 268 ms
Duration 266 ms
Duration 265 ms
Duration 266 ms
Duration 268 ms
Duration 263 ms
Average time is 300 ms

まだ時間が必要なのでView Results in a Tree、実際に応答本文と を確認できる場合に使用する jmeter の別のケースです。View Results in a Table

答えが読みにくくなるのでスクリーンショットは添付しませんが、今回の平均時間は812 ms以前よりも約 100 ミリ秒長くなりました。

応答本文を気にするJavaコード(新しいメソッド):

public static String convertStreamToString(InputStream is) throws IOException {
        if (is != null) {
            StringBuilder sb = new StringBuilder();
            String line;
            try {
                BufferedReader reader = new BufferedReader(new InputStreamReader(is, "UTF-8"));
                while ((line = reader.readLine()) != null) {
                    sb.append(line).append("\n");
                }
            } finally {
                is.close();
            }
            return sb.toString();
        } else {
            return "";
        }
    }

そして、以前のコードを少し変更して、応答を出力し、jmeter の動作をシミュレートし、関連する部分を投稿しました。

HttpGet get = new HttpGet("http://stackoverflow.com");
        HttpClient client = new DefaultHttpClient();
        HttpResponse response = client.execute(get);       

        long endTime = System.currentTimeMillis();
        long duration = (endTime-startTime);
        totalTimeMS +=duration;
        System.out.println(convertStreamToString(response.getEntity().getContent()));
        System.out.format("Duration %d ms\n", duration);

結果は次のとおりです。

Duration 678 ms  + (including printing of response body)
Duration 264 ms + (including printing of response body)
Duration 269 ms + (including printing of response body)
Duration 262 ms + (including printing of response body)
Duration 263 ms + (including printing of response body)
Duration 265 ms + (including printing of response body)
Duration 262 ms + (including printing of response body)
Duration 267 ms + (including printing of response body)
Duration 264 ms + (including printing of response body)
Duration 264 ms + (including printing of response body)
Average time is 305 ms

応答時間が 増加しました5 ms。したがって、jmeter が単純な Java コードよりも高速になる方法がわかりません。とにかく、jmeter は本当に優れたツールであり、最高のツールの 1 つです (無料)。

于 2012-07-12T10:41:19.953 に答える