我遇到了一些性能问题,并且很好奇 Groovy 是否是原因。我做了一个非常简单的测试。
我只是将这两个文件添加到我的 src/main/groovy 或 repsectivly src/main/java 文件夹中。
因为 jdk8 不支持直接执行 .java 文件,所以我使用 open jdk 11 处理 Java 文件,使用 JDK8 处理 groovy 文件。
使用我的 Java 文件,我的执行时间大约为 1 毫秒(我尝试使用 JDK 8 并得到大约 2 毫秒)。使用 Groovy,我的执行时间为 5-7 毫秒。
我正在使用带有 i7-7700 并具有 32 GB RAM 的 PC(Windows 10)。对于 groovy 文件,我使用的是 groovy 2.5.15。
我的测量是错误的还是这种缓慢的“正常”?
编辑:以 1 百万次重复测量:jdk 11:5ms groovy:17-72ms
我创建了这些文件:
复制test.groovy
import groovy.transform.CompileStatic
@CompileStatic
class Copytest {
static class MyObject {
private String field1
private String field2
private String field3
private String field4
private String field5
String getField1() {
return field1
}
void setField1(final String field1) {
this.field1 = field1
}
String getField2() {
return field2
}
void setField2(final String field2) {
this.field2 = field2
}
String getField3() {
return field3
}
void setField3(final String field3) {
this.field3 = field3
}
String getField4() {
return field4
}
void setField4(final String field4) {
this.field4 = field4
}
String getField5() {
return field5
}
void setField5(final String field5) {
this.field5 = field5
}
MyObject copy() {
final MyObject copy = new MyObject()
copy.setField1(getField1())
copy.setField2(getField2())
copy.setField3(getField3())
copy.setField4(getField4())
copy.setField5(getField5())
return copy
}
}
static void main(String[] args) throws Exception {
final long currentTime = System.nanoTime()
final MyObject myObject = new MyObject()
myObject.setField1("1")
myObject.setField2(null)
myObject.setField3("3")
myObject.setField4("4")
myObject.setField5("5")
for (int i = 0; i < 10000; i++) {
myObject.copy();
}
System.out.println("Took " + (((System.nanoTime() - currentTime) / 1000000) as Integer) + " milli seconds to copy")
}
}
复制testJ.java
class CopytestJ {
public static class MyObject {
private String field1;
private String field2;
private String field3;
private String field4;
private String field5;
public String getField1() {
return field1;
}
public void setField1(final String field1) {
this.field1 = field1;
}
public String getField2() {
return field2;
}
public void setField2(final String field2) {
this.field2 = field2;
}
public String getField3() {
return field3;
}
public void setField3(final String field3) {
this.field3 = field3;
}
public String getField4() {
return field4;
}
public void setField4(final String field4) {
this.field4 = field4;
}
public String getField5() {
return field5;
}
public void setField5(final String field5) {
this.field5 = field5;
}
public MyObject copy() {
final MyObject copy = new MyObject();
copy.setField1(getField1());
copy.setField2(getField2());
copy.setField3(getField3());
copy.setField4(getField4());
copy.setField5(getField5());
return copy;
}
}
public static void main(String[] args) {
final long currentTime = System.nanoTime();
final MyObject myObject = new MyObject();
myObject.setField1("1");
myObject.setField2(null);
myObject.setField3("3");
myObject.setField4("4");
myObject.setField5("5");
for (int i = 0; i < 10000; i++) {
myObject.copy();
}
System.out.println("Took " + ((System.nanoTime() - currentTime) / 1000000) + " milli seconds to copy");
}
}