Android NDK -测量阶乘时间
Android NDK - measure time for factorial
我是Android NDK编程的新手,但我想测量用Android NDK计算阶乘所花费的时间,但它总是测量0或1或2ms,这很奇怪。
我的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.");
}
}
我不知道哪里出错了,或者我错过了什么,或者其他什么。
谢谢你的帮助!
这种行为完全可以解释你的代码。你犯了一些错误。你可能知道3万!是一个很大的数字。
-
NDK:
- 你正在使用一个单一的循环,做30k乘法-这发生得非常快
- 你在大约20之后使用jlong(一个有限的64位signed int) !它会溢出,所以你的结果当然是错误的
Android: - BigInteger分配内存以存储您的无限数字。各项运算越来越难,乘法运算越来越复杂
- 在循环中有打印(或者更糟的是,在UI上有SetText() !) -永远不要将它们包含在您的测量中,它们需要时间
相关文章:
- 在 C++ 中的数组上使用阶乘函数
- 阶乘问题在 c++ 中给出错误的输出
- 大数的阶乘给出错误的输出
- 什么模板用法在阶乘中更好
- 为什么我在C++阶乘函数中出现编译错误?
- 计算阶乘的 C++17 倍表达式中的错误
- 为什么 Lisp 中 1000 阶乘的计算如此之快(并显示正确的结果)?
- 在C++中执行 N 阶乘编译时间的 3 种不同/相同方法
- 平方模型为零,阶乘模型问题
- 阶乘元规划
- 阶乘-c++ 我想以不同的方式打印
- 阶乘函数只返回C++中输入的答案
- 阶乘使用循环递增给出垃圾值
- 大 n 表示阶乘
- 为什么我不能在非常量表达式上使用此模板阶乘函数?
- 计算最大数字的阶乘
- 这个阶乘程序内部发生了什么?
- 返回阶乘C++的递归函数
- C++ 中是否有任何内置阶乘函数?
- Android NDK -测量阶乘时间