سؤال

في صمام بلدي أحصل على وقت تنفيذ الاستعلام هتب بلدي من هذا القبيل :

public void invoke(Request request, Response response) 
throws IOException, ServletException {
long t1 = System.currentTimeMillis();
getNext().invoke(request, response);
long t2 = System.currentTimeMillis();
long time = t2 - t1;
...
}

وأظن أن الوقت أحصل على هذا الطريق, ليس فقط تعطيني وقت التنفيذ جانب الخادم ولكن أيضا وقت الشبكة ?هل من الممكن ?

(لأنه اعتمادا على العميل الذي يفعل الطلب متوسط الوقت المقاس ليس هو نفسه من إب واحد لدي 70 مللي ثانية متوسط الوقت و إب آخر 270 مللي ثانية)

لقد كتبت نفس الرمز بالضبط في مرشح:

long before = System.currentTimeMillis();
chain.doFilter(request, response);
long after = System.currentTimeMillis();

, ، ولكن في اختباري ، يكون وقت التنفيذ في الصمام وفي الفلتر هو نفسه...

أنا أكثر اهتماما في الحصول على وقت تنفيذ بريمج بلدي فقط.ولكن إذا كان بإمكاني الحصول على الوقت الذي يتم فيه إرسال البايت الأخير ، فسأكون مهتما.

شكرا جزيلا لتوضيح لي ما هو ممكن أن تعرف مع الصمامات والمرشحات.

هل كانت مفيدة؟

المحلول

وأظن أن الوقت أحصل على هذا الطريق, ليس فقط تعطيني وقت التنفيذ جانب الخادم ولكن أيضا وقت الشبكة ?هل من الممكن ?

هذا صحيح.على الأقل ، يتم تضمين جزء من وقت الشبكة الذي يتضمن نقل نص الطلب في الوقت الإجمالي بهذه الطريقة.يتم استدعاء رمز الصمام / الفلتر / سيرفليت مباشرة بمجرد الطلب الرؤوس تم قراءتها وتحليلها بالكامل.الطلب الجسم ليس بالضرورة قراءة كاملة في تلك المرحلة.يحتوي نص الطلب على كل ما يرسله العميل عبر الشبكة كجزء من الطلب (على سبيل المثال.بيانات النموذج المقدم).فقط عندما يبدأ عامل التصفية / بريمج في قراءة وتحليل نص الطلب الكامل على سبيل المثال. getParameter(), getReader(), getInputStream(), ، وما إلى ذلك ، سيتم بالفعل نقل جميع وحدات البايت من نص الطلب.

قد ترغب في إعادة كتابة قياس وقت التنفيذ بطريقة لا تبدأ إلا بعد قراءة نص الطلب بالكامل.وهذا يعني أن لديك حقا لقياس ذلك الحق داخل بريمج.

@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    // Read the request body.
    String foo = request.getParameter("foo");
    String bar = request.getParameter("bar");
    // ...

    // Now, start the stopwatch.
    long startTime = System.nanoTime();

    // Now, do the business job.
    someService.process(foo, bar, ...);
    // ...

    // Now, stop the stopwatch.
    long elapsedTime = System.nanoTime() - startTime;

    // I don't think that you want to include JSP rendering in total time, right?
    request.getRequestDispatcher("/WEB-INF/some.jsp").forward(request, response);
}

(لاحظ أنني استخدمت System#nanoTime() كما أن لديها أفضل بكثير الدقة)

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top