当前位置: 首页 > news >正文

利用DeepSeek编写go语言按行排序程序

听说google出品的go语言也是系统开发中常用的,性能到底怎么样,还是老办法,让DeepSeek写个程序跑一下,基于以往的经验,直接让它同时编写有缓冲和无缓冲版本。

package mainimport ("bufio""fmt""os""sort""time"
)// 无缓冲版本
func unbufferedSort(filename string) error {lines, err := readLines(filename)if err != nil {return err}sort.Strings(lines) // Go标准库的优化排序for _, line := range lines {fmt.Println(line) // 无缓冲直接输出}return nil
}// 带缓冲版本 (默认4MB缓冲区)
func bufferedSort(filename string, bufferSize int) error {lines, err := readLines(filename)if err != nil {return err}sort.Strings(lines)// 创建缓冲写入器writer := bufio.NewWriterSize(os.Stdout, bufferSize)defer writer.Flush()for _, line := range lines {_, err := writer.WriteString(line + "\n")if err != nil {return err}}return nil
}// 通用文件读取函数
func readLines(filename string) ([]string, error) {file, err := os.Open(filename)if err != nil {return nil, err}defer file.Close()var lines []stringscanner := bufio.NewScanner(file)for scanner.Scan() {lines = append(lines, scanner.Text())}return lines, scanner.Err()
}func main() {if len(os.Args) < 3 {fmt.Println("Usage:")fmt.Println("  sort_lines <filename> <mode> [bufferSize]")fmt.Println("Modes: unbuffered, buffered")os.Exit(1)}filename := os.Args[1]mode := os.Args[2]start := time.Now()var err errorswitch mode {case "unbuffered":err = unbufferedSort(filename)case "buffered":bufferSize := 4 * 1024 * 1024 // 默认4MBif len(os.Args) > 3 {_, err = fmt.Sscanf(os.Args[3], "%d", &bufferSize)if err != nil {fmt.Printf("Invalid buffer size: %v\n", err)os.Exit(1)}}err = bufferedSort(filename, bufferSize)default:fmt.Println("Invalid mode")os.Exit(1)}if err != nil {fmt.Printf("Error: %v\n", err)os.Exit(1)}elapsed := time.Since(start)fmt.Fprintf(os.Stderr, "Processing time: %s\n", elapsed)
}

编译执行

go/bin/go build -o gosort sort_lines.go
time ./gosort varchar.txt buffered > /dev/null
Processing time: 3.497140997sreal    0m3.554s
user    0m0.621s
sys     0m0.366s
time ./gosort varchar.txt unbuffered > /dev/null
Processing time: 3.720407838sreal    0m4.603s
user    0m0.755s
sys     0m0.474s
time ./gosort varchar.txt buffered > vcc.txt
Processing time: 3.798995799sreal    0m3.855s
user    0m0.681s
sys     0m0.301stime ./gosort varchar.txt buffered 65536 > vcc.txt
Processing time: 3.891683917sreal    0m3.959s
user    0m0.627s
sys     0m0.380stime ./gosort varchar.txt unbuffered > vcc.txt
^Creal    1m26.182s
user    0m3.305s
sys     0m7.983s
nm -D gosort >go.h
nm: gosort: no symbols
nm gosort >go.h

如上所示,带缓冲的版本性能尚可,缓冲区大小影响不大。无缓冲版本只能用离奇来表示,而且go语言默认编译就是优化,也没啥可以调优的。
与Zig语言一样,编译出的是静态版本,看不出调用了哪些系统库函数。

后记
张泽鹏先生提醒我是否在WSL上测试,根据以往的经验WSL的读写性能比较糟糕
我改用windows版本编译运行,比较正常

C:\d>gosort varchar.txt buffered > vcc.txt
Processing time: 600.3093msC:\d>gosort varchar.txt unbuffered > vcc.txt
Processing time: 2.4327929s

张先生也写了一版,效率比deepseek的还高一些。他采用了64K读取缓冲区和ReadString,而deepseek使用了NewScanner。

package mainimport ("bufio""fmt""io""os""slices"
)func main() {if len(os.Args) != 2 {fmt.Fprintf(os.Stderr, "Usage: %s <filename>\n", os.Args[0])os.Exit(1)}file, err := os.Open(os.Args[1])if err != nil {fmt.Fprintf(os.Stderr, "failed to open file: %w", err)os.Exit(1)}defer file.Close()lines := make([]string, 0, 1024)// 读取reader := bufio.NewReaderSize(file, 64*1024)for {line, err := reader.ReadString('\n')if err == io.EOF {if len(line) > 0 {// 最后一行有内容但没有换行符;添加内容和换行符lines = append(lines, line + "\n")}break} else if err != nil { // 其他错误fmt.Fprintf(os.Stderr, "failed to read line: %w", err)os.Exit(1)os.Exit(1)} else {lines = append(lines, line)}}// 排序slices.Sort(lines)// 输出writer := bufio.NewWriterSize(os.Stdout, 64*1024)defer writer.Flush()for _, line := range lines {if _, err := writer.WriteString(line); err != nil {fmt.Fprintf(os.Stderr, "failed to write line: %w", err)os.Exit(1)}}
}

在Kylinx上运行的结果如下

:/shujv/par$ time ./zhanggosort varchar.txt > /dev/nullreal	0m0.875s
user	0m0.792s
sys	0m0.156s
:/shujv/par$ time ./zhanggosort varchar.txt > vcc.txtreal	0m0.874s
user	0m0.768s
sys	0m0.052s
:/shujv/par$ time ./gosort varchar.txt buffered > vcc.txt
Processing time: 1.14983689sreal	0m1.187s
user	0m1.132s
sys	0m0.264s

go的一个好处是不挑glibc版本,kylinx直接跑

http://www.lryc.cn/news/612212.html

相关文章:

  • DAY 37 早停策略和模型权重的保存
  • 线程互斥与同步
  • 周鸿祎:AI 时代安全智能体,能否重塑数字安全格局?
  • 一个AI硬件项目经理的PMP实战笔记
  • OpenObserve非sql模式 query editor 中 xx like ‘|’报错如何处理
  • 芯片封装(DIP、SOP、QFP、QFN、BGA、LGA、PGA)
  • 从零开始的云计算生活——第三十八天,避坑落井,Docker容器模块
  • Spring Data MongoDB 教程:用 @Query 快速实现字段查询
  • 模型学习系列之精度
  • 应急响应-windows篇
  • JAVA中关于多线程的学习和使用
  • 猫头虎AI分享:Claude Opus 新版 4.1 在 SWE-bench Verified 上准确率达到了 74.5%,在多文件代码重构方面表现突出
  • [AI 生成] 大数据数仓面试题
  • AI巨模型对决2025:五强争霸,谁能称王?
  • C++音视频流媒体开发面试题:音视频基础
  • 企业知识库:RAG技术实现流程总览(一)
  • 控制服务和守护进程-systemctl
  • C语言route命令详解:网络路由管理的核心工具
  • MaxKB 使用 MCP 连接 Oracle (免安装 cx_Oracle 和 Oracle Instant Client)
  • 搭建SAP S/4HANA虚拟机的安装与配置指南
  • 基于最大似然估计的卡尔曼滤波与自适应模糊PID控制的单片机实现
  • jdk动态代理如何实现
  • 力扣经典算法篇-45-回文数(数字处理:求余+整除,字符串处理:左右指针)
  • Unity笔记(二)——Time、Vector3、位置位移、角度、旋转、缩放、看向
  • 【历史人物】【范仲淹】简历与生平
  • 看不见的伪造痕迹:AI时代的鉴伪攻防战
  • NAT转化
  • 後端開發技術教學(二) 條件指令、循環結構、定義函數
  • 在 Visual Studio Code 中免费使用 Gemini 2.5 Pro API
  • 力扣面试150(48/150)