成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

算法競賽題目中 Golang IO 方法及其火焰圖對比

開發 前端
為什么 bufio.NewScanner + strconv.Atoi 比 bufio.NewReader 快?(一)bufio.NewScanner 直接使用 scanner.Split(bufio.ScanWords) 中的邏輯掃描輸入流;(二)strconv.Atoi 無需做任何反射,其只實現 string 到 int 的轉換。任務越細致,越好做優化。

這里不討論過于 hacky 的方法。對 IO 速度極致要求(甚至在數學上進行優化)可參考:


本文討論 5\n1 2 3 4 5E 這類格式的 Stdin 。具體對比的三種讀入和兩種輸出如下。

package main

import (
 "bufio"
 "fmt"
 "os"
 "runtime/pprof"
 "strconv"
)

func main() {
 f, _ := os.Create("3-2")
 defer f.Close()
 pprof.StartCPUProfile(f)
 defer pprof.StopCPUProfile()

 // n, a := read_stdin_1()
 // n, a := read_stdin_2()
 n, a := read_stdin_3()
 quick_sort(a, 0, n-1)
 // write_stdout_1(n, a)
 write_stdout_2(n, a)
}

// 使用 fmt.Scanf 讀入
func read_stdin_1() (int, []int) {
 var n int
 fmt.Scanf("%d", &n)
 a := make([]int, n)
 for i := 0; i < n; i++ {
  fmt.Scanf("%d", &a[i])
 }
 return n, a
}

// 使用 bufio.NewReader 讀入
func read_stdin_2() (int, []int) {
 in := bufio.NewReader(os.Stdin)

 var n int
 fmt.Fscan(in, &n)
 a := make([]int, n)
 for i := 0; i < n; i++ {
  fmt.Fscan(in, &a[i])
 }
 return n, a
}

// 使用 bufio.NewScanner 讀入
func read_stdin_3() (int, []int) {
 scanner := bufio.NewScanner(os.Stdin)
 scanner.Split(bufio.ScanWords)

 var n int
 scanner.Scan()
 n, _ = strconv.Atoi(scanner.Text())
 a := make([]int, n)
 for i := 0; i < n; i++ {
  scanner.Scan()
  a[i], _ = strconv.Atoi(scanner.Text())
 }
 return n, a
}

// 使用 fmt.Printf 輸出
func write_stdout_1(n int, a []int) {
 for i := 0; i < n; i++ {
  fmt.Printf("%d ", a[i])
 }
}

// 使用 bufio.NewWriter ,手動 Flush 輸出
func write_stdout_2(n int, a []int) {
 out := bufio.NewWriter(os.Stdout)
 defer out.Flush()

 for i := 0; i < n; i++ {
  if i > 0 {
   out.WriteByte(' ')
  }
  out.WriteString(strconv.Itoa(a[i]))
 }
}

測試結果如下:

read

write

time

1

1

5265ms

2

1

1435ms

3

1

976ms

1

2

5156ms

2

2

452ms

3

2

145ms

測試平臺:

先說結論,再看火焰圖

1. 為什么 bufio.NewReader(os.Stdin) + fmt.Fscan 比 fmt.Scanf 快?

(一)每次 fmt.Scanf 都是一次系統調用 Syscall ,而 bufio.NewReader(os.Stdin) 是在內存中緩存了 bufio 的 buf

(二)doScanf 每次會去解析 %d ,而 fmt.Fscan(in, &a[i]) 是根據類型的反射去直接找對對應的 Scan + Parse 函數,如下

// 這里的 arg 就是我們傳進來的 &n 和 &a[i]
func (s *ss) scanOne(verb rune, arg any) {
 s.buf = s.buf[:0]
 var err error
 // If the parameter has its own Scan method, use that.
 if v, ok := arg.(Scanner); ok {
  err = v.Scan(s, verb)
  if err != nil {
   if err == io.EOF {
    err = io.ErrUnexpectedEOF
   }
   s.error(err)
  }
  return
 }

 switch v := arg.(type) {
        ...
 case *int:
  *v = int(s.scanInt(verb, intBits))
        ...

2. 為什么 bufio.NewScanner + strconv.Atoi 比 bufio.NewReader 快?

(一)bufio.NewScanner 直接使用 scanner.Split(bufio.ScanWords) 中的邏輯掃描輸入流

(二)strconv.Atoi 無需做任何反射,其只實現 string 到 int 的轉換。任務越細致,越好做優化

3. 為什么 bufio.NewWriter + strconv.Itoa 比 fmt.Printf 快?

(一)顯而易見,有 buf 減少了系統調用 Syscall 的次數

(二)手動控制 Flush ,可以減少系統調用 Syscall 的次數

(三)strconv.Itoa 同理無需反射或解析 %d

來看火焰圖 Flame Graph

火焰圖測試數據:

  1. n = 1e6
  2. 整數取值范圍:[1, 1e9]

read 1read 1

read 2read 2

read 3read 3

如上,方法二方法三 Syscall 占比小非常多。

write 1write 1

write 2write 2

責任編輯:武曉燕 來源: Piper蛋窩
相關推薦

2020-03-13 07:40:36

Plato數據分析

2010-06-18 13:15:07

UML狀態機圖

2023-05-30 09:07:06

CPU性能火焰圖

2024-06-21 13:11:30

2019-10-14 15:34:10

Web 開發框架

2022-02-03 23:43:51

人工智能程序員AlphaCode

2023-08-03 08:48:07

Golang接口

2023-12-31 19:41:04

PHP性能終端

2023-08-02 09:07:27

Golangio 包

2017-06-23 09:41:04

服務器負載火焰圖

2021-02-02 08:11:50

火焰圖組件技術

2012-03-31 13:55:15

Java

2022-05-17 12:23:25

排序算法面試

2010-07-12 09:30:34

UML模型圖

2010-06-18 09:05:04

UML交互圖

2012-02-22 14:12:08

算法

2025-02-14 08:56:09

GoroutineContextChannel

2024-07-31 08:28:38

2022-01-05 08:56:20

Go火焰圖編程

2023-08-28 17:16:51

Golangio 包
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 久久久久久国模大尺度人体 | 日韩一区精品 | 久久久久成人精品 | 国产色婷婷精品综合在线手机播放 | 中文字幕欧美一区二区 | 黄a网| 日韩毛片免费视频 | 国产精品一区三区 | 日韩精品区 | 欧美日韩视频在线播放 | 中文av在线播放 | 美女在线视频一区二区三区 | 手机av免费在线 | 精品国产乱码久久久久久老虎 | 在线亚洲一区二区 | 久久精品视频亚洲 | 欧美性大战xxxxx久久久 | 亚洲成人精选 | av一区二区三区 | 成人一区二区在线 | 亚洲精品免费在线观看 | 免费久久久久久 | 欧美一区二区三区四区视频 | 国产精品久久免费观看 | 日韩精品久久久久久 | 精品无码久久久久久国产 | 久久国产成人午夜av影院武则天 | 国产精品视频中文字幕 | 狠狠干天天干 | av黄色在线观看 | 一区二区三区四区电影视频在线观看 | 国产一区欧美 | 亚洲一区不卡在线 | 中文字幕一区在线观看视频 | 日韩免费电影 | 国产日韩欧美一区 | 美国黄色毛片 | 一区免费 | 色视频在线播放 | caoporn免费在线视频 | 成人影院av |