2011-08-23 45 views
10

Tôi đã viết một đoạn mã trong c để tính toán thời gian một phần của mã C đang thực hiện, sau đó cố gắng báo cáo lại mã Java. Nhưng vấn đề là sự khác biệt về thời gian luôn luôn trở lại bằng không. đây là bản gốc CBộ đếm thời gian NDK của Android

#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> /* sleep() */ 
#include <time.h> 
#include <jni.h> 

jstring Java_com_nsf_ndkfoo_NDKFooActivity_invokeNativeFunction(JNIEnv* env, jobject javaThis) { 

    time_t start, end; 

    start = time(NULL); 
    if(start == (time_t)-1) { 
     return 1; 
    } 

    sleep(5); 

    end = time(NULL); 

    char buf[60] = { 0 }; 

    sprintf(buf,"according to difftime(), slept for %.8f seconds\n", (int)difftime(end, start)); 

    return (*env)->NewStringUTF(env, buf); 
} 

Khi tôi chạy nó, tôi luôn nhận được "theo difftime(), ngủ cho -0.00000000 giây". Bất kỳ ý tưởng gì là sai?

-------------------------------- Giải pháp mã cuối cùng --------- -----------------------------------------------

Đây là những gì tôi tìm thấy cuối cùng công trình không chắc chắn lý do tại sao như tôi không phải là một guru C nhưng ở đây nó là anyway.

mã Java
#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> /* sleep() */ 
#include <sys/time.h> 
#include <jni.h> 

jstring Java_com_nsf_ndkfoo_NDKFooActivity_invokeNativeFunction(JNIEnv* env, jobject javaThis) { 

    struct timeval start; 
    struct timeval end; 

    gettimeofday(&start, NULL); 
    sleep(5); 

    gettimeofday(&end, NULL); 

    char buf[60] = { 0 }; 

    sprintf(buf,"according to difftime(), slept for %ld seconds\n", ((end.tv_sec * 1000000 + end.tv_usec) - (start.tv_sec * 1000000 + start.tv_usec))); 

    return (*env)->NewStringUTF(env, buf); 
} 

cho vẻ android như thế này:

package com.nsf.ndkfoo; 

import android.app.Activity; 
import android.app.AlertDialog; 
import android.os.Bundle; 

public class NDKFooActivity extends Activity { 
    // load the library - name matches jni/Android.mk 
    static { 
     System.loadLibrary("ndkfoo"); 
    } 

    // declare the native code function - must match ndkfoo.c 
    private native String invokeNativeFunction(); 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     // this is where we call the native code 
     String hello = invokeNativeFunction(); 

     new AlertDialog.Builder(this).setMessage(hello).show(); 
    } 
} 
+1

Chúng tôi chỉ xử lý câu hỏi sử dụng ở đây, câu hỏi dev đi trên [SO]. –

Trả lời

7

Hãy thử sử dụng gettimeofday() để đo thời gian. Tôi đã sử dụng thành công nó với NDK, mặc dù trong trường hợp của tôi là với pthread_cond_timedwait().

2

Xem thông tin này. http://www.cplusplus.com/reference/clibrary/ctime/difftime/

/* difftime example */ 
#include <stdio.h> 
#include <time.h> 

int main() 
{ 
    time_t start,end; 
    char szInput [256]; 
    double dif; 

    time (&start); 
    printf ("Please, enter your name: "); 
    gets (szInput); 
    time (&end); 
    dif = difftime (end,start); 
    printf ("Hi %s.\n", szInput); 
    printf ("It took you %.2lf seconds to type your name.\n", dif); 

    return 0; 
} 
+0

Tôi đã chạy phiên bản này của mã bằng cách sử dụng bộ tính giờ và vẫn còn 0 giây. Đó là lý do tại sao tôi đã đi một con đường khác với mã ở trên. Phải là một cái gì đó với các cuộc gọi Native và đồng hồ hệ thống. – JPM

+0

Bạn đã thử sử dụng Java để đo thời gian chưa? – Frohnzie

0

Kiểm tra mã trở lại cho giấc ngủ() để đảm bảo rằng 0 được trả về, có nghĩa là 5 giây đã hết hạn. Có lẽ việc thực hiện libc bionic của giấc ngủ không hoạt động đúng trong môi trường của bạn (bộ mô phỏng/thiết bị). Hoặc thử và tăng số giây để ngủ lên 60 và thêm một số câu lệnh in trước và sau để đảm bảo rằng phút đó là giấc ngủ xảy ra.

2

Sử dụng gettimeofday() như thế này:

bool QueryPerformanceCounter(int64_t* performance_count) 
{ 
    struct timeval Time; 

    /* Grab the current time. */ 
    gettimeofday(&Time, NULL); 
    *performance_count = Time.tv_usec + /* Microseconds. */ 
         Time.tv_sec * usec_per_sec; /* Seconds. */ 

    return true; 
} 
Các vấn đề liên quan