2011-08-23 16 views
10

मैंने सी में कोड का एक टुकड़ा लिखा है ताकि गणना की जा सके कि सी कोड का एक भाग कितना समय ले रहा था, फिर उसे जावा कोड पर रिपोर्ट करने का प्रयास किया। लेकिन समस्या यह है कि टाइमर अंतर हमेशा शून्य के रूप में वापस आता है। यहां देशी सीएंड्रॉइड एनडीके टाइमर

#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); 
} 

जब मैं इस मैं हमेशा मिल चलाने "difftime के अनुसार(), -०.०००००००० सेकंड के लिए सोया" है। कोई विचार क्या गलत है?

-------------------------------- अंतिम कोड समाधान --------- -----------------------------------------------

यह वही है जो मैंने पाया है अंततः यह सुनिश्चित नहीं करता कि क्यों मैं सी गुरु नहीं हूं लेकिन यहां वैसे भी है। इस तरह एंड्रॉयड दिखता है के लिए

#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); 
} 

जावा कोड:

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

हम केवल उपयोग सवाल यहाँ संभाल, देव सवालों पर जाना [अतः]। –

उत्तर

7

समय मापने के लिए gettimeofday() का उपयोग करने का प्रयास करें। मैंने सफलतापूर्वक एनडीके के साथ इसका उपयोग किया है, हालांकि मेरे मामले में यह pthread_cond_timedwait() के साथ था।

2

इस संदर्भ देखें। 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

मैं पहले से ही टाइमर का उपयोग कर कोड के इस संस्करण को चलाता हूं और अभी भी 0 सेकंड मिल गया है। यही कारण है कि मैं ऊपर दिए गए कोड के साथ एक अलग मार्ग चला गया। मूल कॉल और सिस्टम घड़ी के साथ कुछ होना चाहिए। – JPM

+0

क्या आपने समय मापने के लिए जावा का उपयोग करने की कोशिश की है? – Frohnzie

0

चेक नींद के बदले कोड() सुनिश्चित करना है कि 0 लौटा दिया जाता है, जिसका अर्थ है 5 सेकंड की अवधि समाप्त हो। शायद नींद का बायोनिक libc कार्यान्वयन आपके पर्यावरण (एम्यूलेटर/डिवाइस) में ठीक से काम नहीं कर रहा है। या 60 तक सोने के लिए सेकंड की संख्या को बढ़ाने और बढ़ाने के लिए और यह सुनिश्चित करने के लिए कि कुछ मिनट नींद आती है, कुछ प्रिंट स्टेटमेंट्स जोड़ें।

2

उपयोग gettimeofday() इस तरह:

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; 
} 
संबंधित मुद्दे