diff truffle/com.oracle.truffle.api.interop.java.test/src/com/oracle/truffle/api/interop/java/test/JavaInteropSpeedTest.java @ 22135:e70b20f4bb00

Implementing API for Java/Truffle interop. Based around JavaInterop.asJavaObject and JavaInterop.asTruffleObject methods. Connected to TruffleVM via Symbol.as(Class) wrapper. Verified by extended TCK.
author Jaroslav Tulach <jaroslav.tulach@oracle.com>
date Mon, 07 Sep 2015 17:07:20 +0200
parents
children 291574f3e498
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/truffle/com.oracle.truffle.api.interop.java.test/src/com/oracle/truffle/api/interop/java/test/JavaInteropSpeedTest.java	Mon Sep 07 17:07:20 2015 +0200
@@ -0,0 +1,108 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package com.oracle.truffle.api.interop.java.test;
+
+import com.oracle.truffle.api.interop.TruffleObject;
+import com.oracle.truffle.api.interop.java.JavaInterop;
+import java.util.Random;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.fail;
+
+public class JavaInteropSpeedTest {
+    private static final int REPEAT = 10000;
+    private static int[] arr;
+    private static long javaTime;
+    private static long interopTime;
+
+    @BeforeClass
+    public static void beforeTesting() {
+        arr = initArray(REPEAT);
+        for (int i = 0; i < 1000; i++) {
+            JavaInteropSpeedTest t = new JavaInteropSpeedTest();
+            t.doMinMaxInJava();
+            t.doMinMaxWithInterOp();
+            t.assertSame();
+        }
+    }
+
+    private int mmInOp;
+    private int mmInJava;
+
+    @Test
+    public void doMinMaxInJava() {
+        int max = 0;
+        long now = System.currentTimeMillis();
+        for (int i = 0; i < arr.length; i++) {
+            max = Math.max(arr[i], max);
+        }
+        javaTime = System.currentTimeMillis() - now;
+        mmInJava = max;
+    }
+
+    private void assertSame() {
+        assertEquals(mmInJava, mmInOp);
+    }
+
+    private static final TruffleObject TRUFFLE_MAX = JavaInterop.asTruffleFunction(IntBinaryOperation.class, new IntBinaryOperation() {
+        @Override
+        public int compute(int a, int b) {
+            return Math.max(a, b);
+        }
+    });
+    private static final IntBinaryOperation MAX = JavaInterop.asJavaFunction(IntBinaryOperation.class, TRUFFLE_MAX);
+
+    @Test
+    public void doMinMaxWithInterOp() {
+        int max = 0;
+        long now = System.currentTimeMillis();
+        for (int i = 0; i < arr.length; i++) {
+            max = MAX.compute(arr[i], max);
+        }
+        interopTime = System.currentTimeMillis() - now;
+        mmInOp = max;
+    }
+
+    @AfterClass
+    public static void nonSignificanDifference() {
+        if (javaTime < 1) {
+            javaTime = 1;
+        }
+        if (interopTime > 5 * javaTime) {
+            fail("Interop took too long: " + interopTime + " ms, while java only " + javaTime + " ms");
+        }
+    }
+
+    private static int[] initArray(int size) {
+        Random r = new Random();
+        int[] tmp = new int[size];
+        for (int i = 0; i < tmp.length; i++) {
+            tmp[i] = r.nextInt(100000);
+        }
+        return tmp;
+    }
+}