Android NDK 프로그래밍에서 새로운데 Android NDK로 계승 계승에 소비 된 시간을 측정하고 싶지만 항상 0 또는 1 또는 2ms를 측정합니다. 이상합니다.Android NDK - 계승을위한 계승 시간
내 Android.mk 파일은 다음과 같다 :
LOCAL_PATH := $(call my-dir)
MY_PATH := $(LOCAL_PATH)
include $(call all-subdir-makefiles)
include $(CLEAR_VARS)
LOCAL_PATH := $(MY_PATH)
LOCAL_LDLIBS := -llog
LOCAL_MODULE := kru13_ndktest_NDKTestActivity
LOCAL_SRC_FILES := native.c
include $(BUILD_SHARED_LIBRARY)
NDKTest.cpp은 다음과 같습니다
#include <jni.h>
#include <stdio.h>
JNIEXPORT void JNICALL Java_kru13_ndktest_NDKTestActivity_helloLog(
JNIEnv* env, jobject o, jlong n) {
jlong faktorial = 1;
jlong i;
for(i=1; i<=n; i++){
faktorial = faktorial * i;
}
}
그리고 NDKTestActivity.java은 다음과 같습니다
package kru13.ndktest;
import java.math.BigInteger;
import java.util.Date;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
public class NDKTestActivity extends Activity implements OnClickListener{
public native static void helloLog(long n);
Button vypocti;
EditText vstup;
TextView vysledek;
TextView vypocetjavy;
TextView vypocetndk;
BigInteger faktorial = BigInteger.valueOf(1);
static {
System.loadLibrary("kru13_ndktest_NDKTestActivity");
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
vstup = (EditText) findViewById(R.id.editText1);
vysledek = (TextView) findViewById(R.id.textView3);
vypocetjavy = (TextView) findViewById(R.id.textView1);
vypocetndk = (TextView) findViewById(R.id.textView2);
vypocti = (Button) findViewById(R.id.button1);
vypocti.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
System.out.println("Button pressed.");
Date zacatek = new Date();
//Start Java calculating
if (vstup.getText().toString().equals("")) vstup.setText("0");
int num = Integer.parseInt(vstup.getText().toString());
faktorial = BigInteger.valueOf(1);
for(int i = 1; i<=num; i++){
faktorial = faktorial.multiply(new BigInteger(i + ""));
}
vysledek.setText("");
vysledek.setText("Result is: "+faktorial);
Date konec = new Date();
long rozdil = 0;
rozdil = (konec).getTime() - zacatek.getTime();
vypocetjavy.setText("");
vypocetjavy.setText("Time with Java: "+rozdil+"ms.");
//End Java calculating
//Start NDK calculating
Date zacatek2 = new Date();
num = Integer.parseInt(vstup.getText().toString());
helloLog(num);
System.out.println(num);
Date konec2 = new Date();
long rozdil2 = 0;
rozdil2 = (konec2).getTime() - zacatek2.getTime();
vypocetndk.setText("");
vypocetndk.setText("Time with NDK: "+rozdil2+"ms.");
//End NDK calculating
}
});
}
public void onClick(View V) {
System.out.println("Button pressed.");
}
}
I 실수 나 내가 무엇을 놓쳤는 지 알 수 없습니다.
도움 주셔서 감사합니다.
코드를 파고 들지 않고 잘못 입력 했습니까? 이것은 입상 성 및 다른 것들이 실제 계산 작업에 대한 측정을 지배 할 수 있음을 제시합니다. 어쩌면 문제를 더 오래 걸릴 수 있고 (더 큰 입력 번호 사용), 많은 시험을 실행하여 이상 값 (평균값 이상)을 버리는 평균값을 계산할 수 있습니다. 벤치마킹은 특히 멀티 태스킹 시스템에서 옳다고 평범하지 않습니다. –
답변 해 주셔서 감사합니다. 그러나 30,000에 대한 계승을 계산하려고하면 Java에서 138811ms가 걸리지 만 NDK에서는 2ms 만 걸립니다. 나는 그것이 잘못되었다고 생각한다. 내 프로젝트 어딘가에 업로드하면 다른 사람이 시도 할 수 있습니까? 어쩌면 그걸 볼까? 아마도 NDK 함수를 호출하는 실수 일뿐입니다. 따라서 함수가 올바르게 호출되지 않으면 NDK의 계승을 계산하는 데 0-3ms가 걸립니다 ... – user3633930
다음과 같은 내용이 누락되었습니다. NativeLibrary nativeobject = new NativeLibrary(); nativeobject.result (MainActivity.is); 내 NDKTestActivity.java에? 나는 다른 안드로이드 NDK 프로젝트에서 이와 비슷한 것을 발견했다. – user3633930