0

我遇到了一些性能问题,并且很好奇 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");
    }
}
4

0 回答 0