版本信息

  • 仓颉版本 0.53.18
  • Golang版本 1.22.8
  • Java版本 corretto-1.8.0_452

源码

仓颉

package cangjie_test

import std.time.MonoTime
import std.sync.SyncCounter
import std.fs.*
import std.io.BufferedOutputStream

main() {
    let start = MonoTime.now()
    for (i in 1..11) {
        write(i)
    }
    println("耗时: ${(MonoTime.now()-start).toMilliseconds()} ms")
}

func write(index: Int) {
    let filePath = "./log_cangjie_with_buffer_${index}.txt"
    const rows = 100000
    try (file = File(filePath, OpenOption.CreateOrTruncate(true))) {
        try (output = BufferedOutputStream(file)) {
            for (i in 1..rows + 1) {
                output.write("${i}\n".toArray())
            }
            output.flush()
        }
        file.flush()
    }
}

Java

package java_test;

import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;

public class Main {
    public static void main(String[] args) throws Exception {
        final long start = System.currentTimeMillis();
        for (int i = 1; i < 11; i++) {
            write(i);
        }
        System.out.println(String.format("耗时: %d ms", System.currentTimeMillis() - start));
    }

    static void write(int index) throws Exception {
        final String filePath = "./log_java_with_buffer_" + index + ".txt";
        final int rows = 100000;
        File file = new File(filePath);
        try(FileOutputStream writer = new FileOutputStream(file)){
            try(BufferedOutputStream output = new BufferedOutputStream(writer)){
                for(int i = 1;i < rows+1;i++) {
                    output.write((i+"\n").getBytes());
                }
                output.flush();
            }
            writer.flush();
        }
    }
}

Golang

package main

import (
	"bufio"
	"fmt"
	"os"
	"time"
)

func main() {
	start := time.Now()
	for i := 1; i < 11; i++ {
		write(i)
	}
	fmt.Printf("耗时: %d ms\n", time.Now().Sub(start).Milliseconds())
}

func write(index int) {
	filePath := fmt.Sprintf("./log_go_with_buffer_%d.txt", index)
	const rows = 100000
	file, err := os.Create(filePath)
	if err != nil {
		panic(err)
	}
	defer file.Close()
	output := bufio.NewWriter(file)
	for i := 1; i < rows+1; i++ {
		output.WriteString(fmt.Sprintf("%d\n", i))
	}
	output.Flush()
}

结果

语言 版本 结果
Java corretto-1.8.0_452 136 ms
Golang 1.22.8 80 ms
仓颉 非优化 0.53.18 196 ms
仓颉 O1优化 0.53.18 168 ms
仓颉 O2优化 0.53.18 154 ms
仓颉 Oz优化 0.53.18 171 ms

总结

整体而言,Golang对IO操作相当高效,仓颉仍需努力

Logo

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

更多推荐