2
0
mirror of synced 2025-02-24 07:18:15 +00:00
mobile/bind/java/seq_test.go

173 lines
4.2 KiB
Go
Raw Normal View History

// Copyright 2015 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package java
import (
"fmt"
"io"
"io/ioutil"
"os"
"os/exec"
"path/filepath"
"strings"
"testing"
)
// TestJavaSeqTest runs java test SeqTest.java.
// This requires the gradle command in PATH and
// the Android SDK whose path is available through ANDROID_HOME environment variable.
func TestJavaSeqTest(t *testing.T) {
runTest(t, "golang.org/x/mobile/bind/testpkg", "SeqTest")
mobile/bind: add Android benchmarks Since the normal Go benchmark machinery cannot readily be used for Android apps, a new test, TestJavaSeqBench, is added that builds and runs the new benchmarkpkg package along with its support Java class SeqBench. Benchmarkpkg mimics Go benchmarking, in particular it produces benchcmp compatible output. Excerpts of the output from a Nexus 5: BenchmarkJavaEmpty 65536000 26 ns/op BenchmarkJavaNoargs 256000 7685 ns/op BenchmarkJavaNoargsDirect 64000 17405 ns/op BenchmarkJavaOnearg 64000 26887 ns/op BenchmarkJavaOneret 32000 38325 ns/op BenchmarkJavaManyargs 32000 41720 ns/op BenchmarkJavaRefjava 32000 38139 ns/op BenchmarkJavaRefgo 32000 34403 ns/op BenchmarkJavaStringShort 32000 32366 ns/op BenchmarkJavaStringLong 8000 127879 ns/op BenchmarkJavaSliceShort 32000 42462 ns/op BenchmarkJavaSliceLong 8000 138391 ns/op BenchmarkGoEmpty 524288000 3 ns/op BenchmarkGoNoarg 32000 40342 ns/op BenchmarkGoOnearg 32000 43529 ns/op BenchmarkGoOneret 32000 45456 ns/op BenchmarkGoRefjava 32000 55111 ns/op BenchmarkGoRefgo 32000 57038 ns/op BenchmarkGoManyargs 16000 67967 ns/op BenchmarkGoStringShort 32000 57538 ns/op BenchmarkGoStringLong 8000 128485 ns/op BenchmarkGoSliceShort 32000 59279 ns/op BenchmarkGoSliceLong 4000 411225 ns/op Benchmarks prefixed with "BenchmarkJava" are for calls from Java into Go. Benchmarks prefixed with "BenchmarksGo" are the other way around. Note that all Go benchmarks run against a Java interface implementation while the Java benchmarks calls Go functions directly. In other words, every Go call serializes an implicit Java reference, explaining the higher call times. The JavaRefgo and JavaRefjava tests attempt to quantify the overhead equivalent for Java. The "Direct" suffix are for variants that runs the benchmarks from a new thread or goroutine. For Go it makes little difference, but there is a noticable speedup when calling Go from Java when there is already a JNI call context earlier in the stack. The benchmarks are for Android only for now, but the benchmarkpkg has been added to the common golang.org/x/mobile/bind package in anticipation of future iOS support. Change-Id: I3c948dc710b65bc348e7635416324095060a5beb Reviewed-on: https://go-review.googlesource.com/20095 Reviewed-by: David Crawshaw <crawshaw@golang.org>
2016-03-02 11:50:19 +01:00
}
// TestJavaSeqBench runs java test SeqBench.java, with the same
// environment requirements as TestJavaSeqTest.
//
// The benchmarks runs on the phone, so the benchmarkpkg implements
// rudimentary timing logic and outputs benchcmp compatible runtimes
// to logcat. Use
//
// adb logcat -v raw GoLog:* *:S
//
// while running the benchmark to see the results.
func TestJavaSeqBench(t *testing.T) {
runTest(t, "golang.org/x/mobile/bind/benchmark", "SeqBench")
mobile/bind: add Android benchmarks Since the normal Go benchmark machinery cannot readily be used for Android apps, a new test, TestJavaSeqBench, is added that builds and runs the new benchmarkpkg package along with its support Java class SeqBench. Benchmarkpkg mimics Go benchmarking, in particular it produces benchcmp compatible output. Excerpts of the output from a Nexus 5: BenchmarkJavaEmpty 65536000 26 ns/op BenchmarkJavaNoargs 256000 7685 ns/op BenchmarkJavaNoargsDirect 64000 17405 ns/op BenchmarkJavaOnearg 64000 26887 ns/op BenchmarkJavaOneret 32000 38325 ns/op BenchmarkJavaManyargs 32000 41720 ns/op BenchmarkJavaRefjava 32000 38139 ns/op BenchmarkJavaRefgo 32000 34403 ns/op BenchmarkJavaStringShort 32000 32366 ns/op BenchmarkJavaStringLong 8000 127879 ns/op BenchmarkJavaSliceShort 32000 42462 ns/op BenchmarkJavaSliceLong 8000 138391 ns/op BenchmarkGoEmpty 524288000 3 ns/op BenchmarkGoNoarg 32000 40342 ns/op BenchmarkGoOnearg 32000 43529 ns/op BenchmarkGoOneret 32000 45456 ns/op BenchmarkGoRefjava 32000 55111 ns/op BenchmarkGoRefgo 32000 57038 ns/op BenchmarkGoManyargs 16000 67967 ns/op BenchmarkGoStringShort 32000 57538 ns/op BenchmarkGoStringLong 8000 128485 ns/op BenchmarkGoSliceShort 32000 59279 ns/op BenchmarkGoSliceLong 4000 411225 ns/op Benchmarks prefixed with "BenchmarkJava" are for calls from Java into Go. Benchmarks prefixed with "BenchmarksGo" are the other way around. Note that all Go benchmarks run against a Java interface implementation while the Java benchmarks calls Go functions directly. In other words, every Go call serializes an implicit Java reference, explaining the higher call times. The JavaRefgo and JavaRefjava tests attempt to quantify the overhead equivalent for Java. The "Direct" suffix are for variants that runs the benchmarks from a new thread or goroutine. For Go it makes little difference, but there is a noticable speedup when calling Go from Java when there is already a JNI call context earlier in the stack. The benchmarks are for Android only for now, but the benchmarkpkg has been added to the common golang.org/x/mobile/bind package in anticipation of future iOS support. Change-Id: I3c948dc710b65bc348e7635416324095060a5beb Reviewed-on: https://go-review.googlesource.com/20095 Reviewed-by: David Crawshaw <crawshaw@golang.org>
2016-03-02 11:50:19 +01:00
}
func runTest(t *testing.T, pkgName, javaCls string) {
if _, err := run("which gradle"); err != nil {
t.Skip("command gradle not found, skipping")
}
if sdk := os.Getenv("ANDROID_HOME"); sdk == "" {
t.Skip("ANDROID_HOME environment var not set, skipping")
}
if _, err := run("which gomobile"); err != nil {
_, err := run("go install golang.org/x/mobile/cmd/gomobile")
if err != nil {
t.Skip("gomobile not available, skipping")
}
}
// TODO(hyangah): gomobile init if necessary.
cwd, err := os.Getwd()
if err != nil {
t.Fatalf("failed pwd: %v", err)
}
tmpdir, err := ioutil.TempDir("", "bind-java-seq-test-")
if err != nil {
t.Fatalf("failed to prepare temp dir: %v", err)
}
defer os.RemoveAll(tmpdir)
t.Logf("tmpdir = %s", tmpdir)
if err := os.Chdir(tmpdir); err != nil {
t.Fatalf("failed chdir: %v", err)
}
defer os.Chdir(cwd)
for _, d := range []string{"src/main", "src/androidTest/java/go", "libs"} {
err = os.MkdirAll(filepath.Join(tmpdir, d), 0700)
if err != nil {
t.Fatal(err)
}
}
mobile/bind: add Android benchmarks Since the normal Go benchmark machinery cannot readily be used for Android apps, a new test, TestJavaSeqBench, is added that builds and runs the new benchmarkpkg package along with its support Java class SeqBench. Benchmarkpkg mimics Go benchmarking, in particular it produces benchcmp compatible output. Excerpts of the output from a Nexus 5: BenchmarkJavaEmpty 65536000 26 ns/op BenchmarkJavaNoargs 256000 7685 ns/op BenchmarkJavaNoargsDirect 64000 17405 ns/op BenchmarkJavaOnearg 64000 26887 ns/op BenchmarkJavaOneret 32000 38325 ns/op BenchmarkJavaManyargs 32000 41720 ns/op BenchmarkJavaRefjava 32000 38139 ns/op BenchmarkJavaRefgo 32000 34403 ns/op BenchmarkJavaStringShort 32000 32366 ns/op BenchmarkJavaStringLong 8000 127879 ns/op BenchmarkJavaSliceShort 32000 42462 ns/op BenchmarkJavaSliceLong 8000 138391 ns/op BenchmarkGoEmpty 524288000 3 ns/op BenchmarkGoNoarg 32000 40342 ns/op BenchmarkGoOnearg 32000 43529 ns/op BenchmarkGoOneret 32000 45456 ns/op BenchmarkGoRefjava 32000 55111 ns/op BenchmarkGoRefgo 32000 57038 ns/op BenchmarkGoManyargs 16000 67967 ns/op BenchmarkGoStringShort 32000 57538 ns/op BenchmarkGoStringLong 8000 128485 ns/op BenchmarkGoSliceShort 32000 59279 ns/op BenchmarkGoSliceLong 4000 411225 ns/op Benchmarks prefixed with "BenchmarkJava" are for calls from Java into Go. Benchmarks prefixed with "BenchmarksGo" are the other way around. Note that all Go benchmarks run against a Java interface implementation while the Java benchmarks calls Go functions directly. In other words, every Go call serializes an implicit Java reference, explaining the higher call times. The JavaRefgo and JavaRefjava tests attempt to quantify the overhead equivalent for Java. The "Direct" suffix are for variants that runs the benchmarks from a new thread or goroutine. For Go it makes little difference, but there is a noticable speedup when calling Go from Java when there is already a JNI call context earlier in the stack. The benchmarks are for Android only for now, but the benchmarkpkg has been added to the common golang.org/x/mobile/bind package in anticipation of future iOS support. Change-Id: I3c948dc710b65bc348e7635416324095060a5beb Reviewed-on: https://go-review.googlesource.com/20095 Reviewed-by: David Crawshaw <crawshaw@golang.org>
2016-03-02 11:50:19 +01:00
buf, err := run("gomobile bind -o pkg.aar " + pkgName)
if err != nil {
t.Logf("%s", buf)
t.Fatalf("failed to run gomobile bind: %v", err)
}
mobile/bind: add Android benchmarks Since the normal Go benchmark machinery cannot readily be used for Android apps, a new test, TestJavaSeqBench, is added that builds and runs the new benchmarkpkg package along with its support Java class SeqBench. Benchmarkpkg mimics Go benchmarking, in particular it produces benchcmp compatible output. Excerpts of the output from a Nexus 5: BenchmarkJavaEmpty 65536000 26 ns/op BenchmarkJavaNoargs 256000 7685 ns/op BenchmarkJavaNoargsDirect 64000 17405 ns/op BenchmarkJavaOnearg 64000 26887 ns/op BenchmarkJavaOneret 32000 38325 ns/op BenchmarkJavaManyargs 32000 41720 ns/op BenchmarkJavaRefjava 32000 38139 ns/op BenchmarkJavaRefgo 32000 34403 ns/op BenchmarkJavaStringShort 32000 32366 ns/op BenchmarkJavaStringLong 8000 127879 ns/op BenchmarkJavaSliceShort 32000 42462 ns/op BenchmarkJavaSliceLong 8000 138391 ns/op BenchmarkGoEmpty 524288000 3 ns/op BenchmarkGoNoarg 32000 40342 ns/op BenchmarkGoOnearg 32000 43529 ns/op BenchmarkGoOneret 32000 45456 ns/op BenchmarkGoRefjava 32000 55111 ns/op BenchmarkGoRefgo 32000 57038 ns/op BenchmarkGoManyargs 16000 67967 ns/op BenchmarkGoStringShort 32000 57538 ns/op BenchmarkGoStringLong 8000 128485 ns/op BenchmarkGoSliceShort 32000 59279 ns/op BenchmarkGoSliceLong 4000 411225 ns/op Benchmarks prefixed with "BenchmarkJava" are for calls from Java into Go. Benchmarks prefixed with "BenchmarksGo" are the other way around. Note that all Go benchmarks run against a Java interface implementation while the Java benchmarks calls Go functions directly. In other words, every Go call serializes an implicit Java reference, explaining the higher call times. The JavaRefgo and JavaRefjava tests attempt to quantify the overhead equivalent for Java. The "Direct" suffix are for variants that runs the benchmarks from a new thread or goroutine. For Go it makes little difference, but there is a noticable speedup when calling Go from Java when there is already a JNI call context earlier in the stack. The benchmarks are for Android only for now, but the benchmarkpkg has been added to the common golang.org/x/mobile/bind package in anticipation of future iOS support. Change-Id: I3c948dc710b65bc348e7635416324095060a5beb Reviewed-on: https://go-review.googlesource.com/20095 Reviewed-by: David Crawshaw <crawshaw@golang.org>
2016-03-02 11:50:19 +01:00
fname := filepath.Join(tmpdir, "libs", "pkg.aar")
err = cp(fname, filepath.Join(tmpdir, "pkg.aar"))
if err != nil {
mobile/bind: add Android benchmarks Since the normal Go benchmark machinery cannot readily be used for Android apps, a new test, TestJavaSeqBench, is added that builds and runs the new benchmarkpkg package along with its support Java class SeqBench. Benchmarkpkg mimics Go benchmarking, in particular it produces benchcmp compatible output. Excerpts of the output from a Nexus 5: BenchmarkJavaEmpty 65536000 26 ns/op BenchmarkJavaNoargs 256000 7685 ns/op BenchmarkJavaNoargsDirect 64000 17405 ns/op BenchmarkJavaOnearg 64000 26887 ns/op BenchmarkJavaOneret 32000 38325 ns/op BenchmarkJavaManyargs 32000 41720 ns/op BenchmarkJavaRefjava 32000 38139 ns/op BenchmarkJavaRefgo 32000 34403 ns/op BenchmarkJavaStringShort 32000 32366 ns/op BenchmarkJavaStringLong 8000 127879 ns/op BenchmarkJavaSliceShort 32000 42462 ns/op BenchmarkJavaSliceLong 8000 138391 ns/op BenchmarkGoEmpty 524288000 3 ns/op BenchmarkGoNoarg 32000 40342 ns/op BenchmarkGoOnearg 32000 43529 ns/op BenchmarkGoOneret 32000 45456 ns/op BenchmarkGoRefjava 32000 55111 ns/op BenchmarkGoRefgo 32000 57038 ns/op BenchmarkGoManyargs 16000 67967 ns/op BenchmarkGoStringShort 32000 57538 ns/op BenchmarkGoStringLong 8000 128485 ns/op BenchmarkGoSliceShort 32000 59279 ns/op BenchmarkGoSliceLong 4000 411225 ns/op Benchmarks prefixed with "BenchmarkJava" are for calls from Java into Go. Benchmarks prefixed with "BenchmarksGo" are the other way around. Note that all Go benchmarks run against a Java interface implementation while the Java benchmarks calls Go functions directly. In other words, every Go call serializes an implicit Java reference, explaining the higher call times. The JavaRefgo and JavaRefjava tests attempt to quantify the overhead equivalent for Java. The "Direct" suffix are for variants that runs the benchmarks from a new thread or goroutine. For Go it makes little difference, but there is a noticable speedup when calling Go from Java when there is already a JNI call context earlier in the stack. The benchmarks are for Android only for now, but the benchmarkpkg has been added to the common golang.org/x/mobile/bind package in anticipation of future iOS support. Change-Id: I3c948dc710b65bc348e7635416324095060a5beb Reviewed-on: https://go-review.googlesource.com/20095 Reviewed-by: David Crawshaw <crawshaw@golang.org>
2016-03-02 11:50:19 +01:00
t.Fatalf("failed to copy pkg.aar: %v", err)
}
mobile/bind: add Android benchmarks Since the normal Go benchmark machinery cannot readily be used for Android apps, a new test, TestJavaSeqBench, is added that builds and runs the new benchmarkpkg package along with its support Java class SeqBench. Benchmarkpkg mimics Go benchmarking, in particular it produces benchcmp compatible output. Excerpts of the output from a Nexus 5: BenchmarkJavaEmpty 65536000 26 ns/op BenchmarkJavaNoargs 256000 7685 ns/op BenchmarkJavaNoargsDirect 64000 17405 ns/op BenchmarkJavaOnearg 64000 26887 ns/op BenchmarkJavaOneret 32000 38325 ns/op BenchmarkJavaManyargs 32000 41720 ns/op BenchmarkJavaRefjava 32000 38139 ns/op BenchmarkJavaRefgo 32000 34403 ns/op BenchmarkJavaStringShort 32000 32366 ns/op BenchmarkJavaStringLong 8000 127879 ns/op BenchmarkJavaSliceShort 32000 42462 ns/op BenchmarkJavaSliceLong 8000 138391 ns/op BenchmarkGoEmpty 524288000 3 ns/op BenchmarkGoNoarg 32000 40342 ns/op BenchmarkGoOnearg 32000 43529 ns/op BenchmarkGoOneret 32000 45456 ns/op BenchmarkGoRefjava 32000 55111 ns/op BenchmarkGoRefgo 32000 57038 ns/op BenchmarkGoManyargs 16000 67967 ns/op BenchmarkGoStringShort 32000 57538 ns/op BenchmarkGoStringLong 8000 128485 ns/op BenchmarkGoSliceShort 32000 59279 ns/op BenchmarkGoSliceLong 4000 411225 ns/op Benchmarks prefixed with "BenchmarkJava" are for calls from Java into Go. Benchmarks prefixed with "BenchmarksGo" are the other way around. Note that all Go benchmarks run against a Java interface implementation while the Java benchmarks calls Go functions directly. In other words, every Go call serializes an implicit Java reference, explaining the higher call times. The JavaRefgo and JavaRefjava tests attempt to quantify the overhead equivalent for Java. The "Direct" suffix are for variants that runs the benchmarks from a new thread or goroutine. For Go it makes little difference, but there is a noticable speedup when calling Go from Java when there is already a JNI call context earlier in the stack. The benchmarks are for Android only for now, but the benchmarkpkg has been added to the common golang.org/x/mobile/bind package in anticipation of future iOS support. Change-Id: I3c948dc710b65bc348e7635416324095060a5beb Reviewed-on: https://go-review.googlesource.com/20095 Reviewed-by: David Crawshaw <crawshaw@golang.org>
2016-03-02 11:50:19 +01:00
fname = filepath.Join(tmpdir, "src/androidTest/java/go/"+javaCls+".java")
err = cp(fname, filepath.Join(cwd, javaCls+".java"))
if err != nil {
t.Fatalf("failed to copy SeqTest.java: %v", err)
}
fname = filepath.Join(tmpdir, "src/main/AndroidManifest.xml")
err = ioutil.WriteFile(fname, []byte(androidmanifest), 0700)
if err != nil {
t.Fatalf("failed to write android manifest file: %v", err)
}
fname = filepath.Join(tmpdir, "build.gradle")
err = ioutil.WriteFile(fname, []byte(buildgradle), 0700)
if err != nil {
t.Fatalf("failed to write build.gradle file: %v", err)
}
if buf, err := run("gradle connectedAndroidTest"); err != nil {
t.Logf("%s", buf)
t.Errorf("failed to run gradle test: %v", err)
}
}
func run(cmd string) ([]byte, error) {
c := strings.Split(cmd, " ")
return exec.Command(c[0], c[1:]...).CombinedOutput()
}
func cp(dst, src string) error {
r, err := os.Open(src)
if err != nil {
return fmt.Errorf("failed to read source: %v", err)
}
defer r.Close()
w, err := os.Create(dst)
if err != nil {
return fmt.Errorf("failed to open destination: %v", err)
}
_, err = io.Copy(w, r)
cerr := w.Close()
if err != nil {
return err
}
return cerr
}
const androidmanifest = `<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.BindTest"
android:versionCode="1"
android:versionName="1.0">
</manifest>`
const buildgradle = `buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:1.1.3'
}
}
allprojects {
repositories { jcenter() }
}
apply plugin: 'com.android.library'
android {
compileSdkVersion 'android-19'
buildToolsVersion '21.1.2'
defaultConfig { minSdkVersion 15 }
}
repositories {
flatDir { dirs 'libs' }
}
dependencies {
compile 'com.android.support:appcompat-v7:19.0.0'
mobile/bind: add Android benchmarks Since the normal Go benchmark machinery cannot readily be used for Android apps, a new test, TestJavaSeqBench, is added that builds and runs the new benchmarkpkg package along with its support Java class SeqBench. Benchmarkpkg mimics Go benchmarking, in particular it produces benchcmp compatible output. Excerpts of the output from a Nexus 5: BenchmarkJavaEmpty 65536000 26 ns/op BenchmarkJavaNoargs 256000 7685 ns/op BenchmarkJavaNoargsDirect 64000 17405 ns/op BenchmarkJavaOnearg 64000 26887 ns/op BenchmarkJavaOneret 32000 38325 ns/op BenchmarkJavaManyargs 32000 41720 ns/op BenchmarkJavaRefjava 32000 38139 ns/op BenchmarkJavaRefgo 32000 34403 ns/op BenchmarkJavaStringShort 32000 32366 ns/op BenchmarkJavaStringLong 8000 127879 ns/op BenchmarkJavaSliceShort 32000 42462 ns/op BenchmarkJavaSliceLong 8000 138391 ns/op BenchmarkGoEmpty 524288000 3 ns/op BenchmarkGoNoarg 32000 40342 ns/op BenchmarkGoOnearg 32000 43529 ns/op BenchmarkGoOneret 32000 45456 ns/op BenchmarkGoRefjava 32000 55111 ns/op BenchmarkGoRefgo 32000 57038 ns/op BenchmarkGoManyargs 16000 67967 ns/op BenchmarkGoStringShort 32000 57538 ns/op BenchmarkGoStringLong 8000 128485 ns/op BenchmarkGoSliceShort 32000 59279 ns/op BenchmarkGoSliceLong 4000 411225 ns/op Benchmarks prefixed with "BenchmarkJava" are for calls from Java into Go. Benchmarks prefixed with "BenchmarksGo" are the other way around. Note that all Go benchmarks run against a Java interface implementation while the Java benchmarks calls Go functions directly. In other words, every Go call serializes an implicit Java reference, explaining the higher call times. The JavaRefgo and JavaRefjava tests attempt to quantify the overhead equivalent for Java. The "Direct" suffix are for variants that runs the benchmarks from a new thread or goroutine. For Go it makes little difference, but there is a noticable speedup when calling Go from Java when there is already a JNI call context earlier in the stack. The benchmarks are for Android only for now, but the benchmarkpkg has been added to the common golang.org/x/mobile/bind package in anticipation of future iOS support. Change-Id: I3c948dc710b65bc348e7635416324095060a5beb Reviewed-on: https://go-review.googlesource.com/20095 Reviewed-by: David Crawshaw <crawshaw@golang.org>
2016-03-02 11:50:19 +01:00
compile(name: "pkg", ext: "aar")
}
`