版本信息

仓颉版本 0.53.18

Golang版本 1.22.8

Java版本 corretto-1.8.0_452

源码

仓颉

package cangjie_test

import std.collection.ArrayList
import std.time.MonoTime

main() {
    let start = MonoTime.now()
    let num = 1000000
    let extendCounts = ArrayList<Int>() // 分别扩容次数
    for (i in 1..11) {
        extendCounts.append(arrayListExtend(num))
    }

    println("耗时: ${(MonoTime.now()-start).toMilliseconds()} ms")
    println("分别扩容次数: ${extendCounts}")
}

func arrayListExtend(arrNum: Int): Int {
    let arrList = ArrayList<Int>()
    var extendCount = 0
    var tmpCapacity = arrList.capacity()
    for (i in 1..arrNum + 2) {
        arrList.append(i)
        if (tmpCapacity != arrList.capacity()) {
            extendCount++
            tmpCapacity = arrList.capacity()
        }
    }

    return extendCount
}

Golang

package main

import (
	"fmt"
	"time"
)

func main() {
	start := time.Now()
	num := 1000000
	var extendCounts []int // 分别扩容次数
	for i := 1; i < 11; i++ {
		extendCounts = append(extendCounts, arrayListExtend(num))
	}

	fmt.Printf("耗时: %d ms\n", time.Now().Sub(start).Milliseconds())
	fmt.Printf("分别扩容次数: %v", extendCounts)
}

func arrayListExtend(arrNum int) int {
	var arrList []int
	var extendCount = 0
	var tmpCapacity = cap(arrList)
	for i := 1; i < arrNum+2; i++ {
		arrList = append(arrList, i)
		if tmpCapacity != cap(arrList) {
			extendCount++
			tmpCapacity = cap(arrList)
		}
	}

	return extendCount
}

Java

package java_test;

import java.util.*;
import java.lang.reflect.*;

public class Main {
    public static void main(String[] args) throws Exception {
        final long start = System.currentTimeMillis();
        int num = 1000000;
        final ArrayList<Integer> extendCounts = new ArrayList();
        for (int i = 1; i < 11; i++) {
            extendCounts.add(arrayListExtend(num));
        }

        System.out.println(String.format("耗时: %d ms", System.currentTimeMillis() - start));
        System.out.println(String.format("分别扩容次数: %s", extendCounts));
    }

    static int arrayListExtend(int arrNum) throws Exception {
        final ArrayList<Integer> arrList = new ArrayList();
        int extendCount = 0;
        Class<? extends List> clazz = arrList.getClass();
        Field field = clazz.getDeclaredField("elementData");
        field.setAccessible(true);
        int tmpCapacity = ((Object[]) field.get(arrList)).length;
        int _tmpCapacity = tmpCapacity;
        for (int i = 1; i < arrNum + 2; i++) {
            arrList.add(i);
            if ((_tmpCapacity = ((Object[]) field.get(arrList)).length) != tmpCapacity) {
                extendCount++;
                tmpCapacity = _tmpCapacity;
            }
        }

        return extendCount;
    }
}

结果

语言 版本 结果
Java corretto-1.8.0_452 112 ms 扩容次数 30
Golang 1.22.8 76 ms 扩容次数 38
仓颉 0.53.18 非优化结果 649 ms 扩容次数 28
仓颉 0.53.18 O1优化结果 121 ms 扩容次数 28
仓颉 0.53.18 O2优化结果 94 ms 扩容次数 28
仓颉 0.53.18 Oz优化结果 97 ms 扩容次数 28

总结

仓颉仍需努力

Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐