海量编程文章、技术教程与实战案例

网站首页 > 技术文章 正文

仓颉、Java、Golang性能测试——无缓存区文件写入

yimeika 2025-07-25 02:30:32 技术文章 3 ℃

版本信息

  • 仓颉版本 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.*

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_no_buffer_${index}.txt"
    let rows = 100000
    try (file = File(filePath, OpenOption.CreateOrTruncate(true))) {
        for (i in 1..rows + 1) {
            file.write("${i}\n".toArray())
        }
        file.flush()
    }
}

Java

package java_test;

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_no_buffer_" + index + ".txt";
        final long rows = 100000; // 写入10W行内容
        File file = new File(filePath);
        try (FileOutputStream writer = new FileOutputStream(file)) {
            for (long i = 1; i < rows + 1; i++) {
                writer.write((i + "\n").getBytes());
            }
            writer.flush(); // 刷入内容
        }
    }
}

Golang

package main

import (
	"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_no_buffer_%d.txt", index)
	rows := 100000
	file, err := os.Create(filePath)
	if err != nil {
		panic(err)
	}
	defer file.Close()
	for i := 1; i < rows+1; i++ {
		file.WriteString(fmt.Sprintf("%d\n", i))
	}
}

结果

  • Java 结果 1727 ms
  • Golang 结果 1611 ms
  • 仓颉 非优化结果 1750 ms
  • 仓颉 O1优化结果 1643 ms
  • 仓颉 O2优化结果 1638 ms
  • 仓颉 Oz优化结果 1624 ms

总结

整体而言,Golang相对比较高效,仓颉仍需努力

最近发表
标签列表