JNI性能测试一—JNI调用C与Java调用java性能比较

PerformanceTest.java

package com.jni; import android.app.Activity; import android.os.Bundle; import android.util.Log; public class PerformanceTest extends Activity { static { try { System.loadLibrary("PerformanceTest"); } catch (UnsatisfiedLinkError ule) { System.err.println("WARNING: Could not load library!"); } } private final String PerformanceTestTAG ="PerformanceTest:performanceTestFunc :"; /* JNI 测试函数 */ private native void emptyJniFunction(); /* JAVA测试函数 */ private void emptyJavaFunction() { } /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); performanceTestFunc(); } /* 性能测试函数 */ public void performanceTestFunc() { /* 测试数量级为100万次 */ int mLoopCount = 1000000; int i = 0; int base = 1000000; String timeStr_ms; /* 毫秒对应String*/ /* 精确度为纳秒级 */ long startTime = System.nanoTime(); /* JNI 调用 */ for(i = 0;i <= mLoopCount; ++ i) { emptyJniFunction(); } long endTime = System.nanoTime(); timeStr_ms = String.valueOf((endTime-startTime)/base); Log.v(PerformanceTestTAG+"In Jni:", timeStr_ms+"ms"); startTime = System.nanoTime(); /* JAVA 调用 */ for(i = 0;i <= mLoopCount; ++ i) { emptyJavaFunction(); } endTime = System.nanoTime(); timeStr_ms = String.valueOf((endTime-startTime)/base); Log.v(PerformanceTestTAG+"In JAVA:", timeStr_ms+"ms"); } }

com_jni_PerformanceTest.c

/* DO NOT EDIT THIS FILE - it is machine generated */ #include <jni.h> /* Header for class com_jni_PerformanceTest */ #ifndef _Included_com_jni_PerformanceTest #define _Included_com_jni_PerformanceTest #ifdef __cplusplus extern "C" { #endif /* * Class: com_jni_PerformanceTest * Method: emptyJniFunction * Signature: ()V */ JNIEXPORT void JNICALL Java_com_jni_PerformanceTest_emptyJniFunction (JNIEnv *env, jobject obj) { } JNIEXPORT jint JNI_OnLoad(JavaVM* vm, void* reserved) { JNIEnv *env; int result; result = JNI_VERSION_1_4; return result; } #ifdef __cplusplus } #endif #endif

Android.mk

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE     := PerformanceTest

LOCAL_SRC_FILES :=  src/com_jni_PerformanceTest.c


include $(BUILD_SHARED_LIBRARY)

 

 

如上图所示,通过Jni调用c的空实现函数,调用100万次,用时41747ms,而使用java调用java的空实现函数100万次,用时25378ms。以上测试数量级为100万次,系统android 2.2,测试于android模拟器上,jdk1.6.0_17。

你可能感兴趣的:(java,c,String,jni,测试,library)