import java.lang.reflect.Method;
class Main {
public static final int REPEAT = 100 * 1000;
static {
System.loadLibrary("Main");
}
static void report(long start, String name) {
long end = System.currentTimeMillis();
System.err.println("mangled: time " + (end - start) + ", " + name);
}
public static void emptyCBlockInJava() {
long n = REPEAT;
long start = System.currentTimeMillis();
for(long i=0; i < n; i++) {
emptyCBlockInJava_j2c();
}
report(start, "emptyCBlockInJava");
}
static native void emptyCBlockInJava_j2c();
public static void emptyJavaBlockInC() {
long start = System.currentTimeMillis();
emptyJavaBlockInC_j2c();
report(start, "emptyJavaBlockInC");
}
static native void emptyJavaBlockInC_j2c();
static void emptyJavaBlockInC_c2j() { }
public static void constantCExpressionInJava() {
long n = REPEAT;
long start = System.currentTimeMillis();
long s = 0;
for (long i=0; i<n; i++)
s += constantCExpressionInJava_j2c();
if (n != s)
System.out.println("error");
report(start, "constantCExpressionInJava");
}
static native int constantCExpressionInJava_j2c();
public static void constantJavaExpressionInC() {
long start = System.currentTimeMillis();
constantJavaExpressionInC_j2c();
report(start, "constantJavaExpressionInC");
}
static int constantJavaExpressionInC_c2j() {
return 1;
}
static native void constantJavaExpressionInC_j2c();
public static void arrayReadAccess() {
long start = System.currentTimeMillis();
arrayReadAccess_j2c();
report(start, "arrayReadAccess");
}
static native void arrayReadAccess_j2c();
static int[] arrayReadAccess_c2j() {
int[] a = new int[1000];
for (int i=0; i<a.length; i++)
a[i] = 1;
return a;
}
public static void arrayWriteAccess() {
int[] a = new int[1000];
long start = System.currentTimeMillis();
arrayWriteAccess_j2c(a);
report(start, "arrayWriteAccess");
for(int i=0; i<a.length; i++)
if (1 != a[i]) System.out.println("error");
}
static native void arrayWriteAccess_j2c(int[] a);
public static void exceptionJavaInCInJava() {
long n = REPEAT;
long start = System.currentTimeMillis();
for (long i=0; i<n; i++) {
try{
exceptionJavaInCInJava_j2c();
} catch (Exception e) {
/* empty catch block */
}
}
report(start, "exceptionJavaInCInJava");
}
static native void exceptionJavaInCInJava_j2c() throws Exception;
static void exceptionJavaInCInJava_c2j() throws Exception {
throw new Exception();
}
public static void main(String[] args) throws Exception {
if (1 == args.length) {
final Method m = Main.class.getMethod(args[0], (Class[])null);
m.invoke(null, new Object[]{});
return;
}
emptyCBlockInJava();
System.gc();
emptyJavaBlockInC();
System.gc();
constantCExpressionInJava();
System.gc();
constantJavaExpressionInC();
System.gc();
arrayReadAccess();
System.gc();
arrayWriteAccess();
System.gc();
exceptionJavaInCInJava();
}
}