第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

計算 Go 中切片中字符的出現(xiàn)次數(shù)

計算 Go 中切片中字符的出現(xiàn)次數(shù)

Go
慕工程0101907 2021-09-13 16:58:00
好的,所以我撞到了一堵磚墻。編輯:bytes.IndexByte()在我的count()函數(shù)中 使用使其運行速度幾乎快兩倍。bytes.IndexByte()是用匯編而不是 Go 編寫的。仍然不是C速度,但更接近。我有兩個程序,一個在 C 中,一個在 Go 中,它們都計算文件中的換行符。超級簡單。在 2.4GB 的文件上,C 程序運行約 1.5 秒,Go 運行約 4.25 秒。我是否達到了 Go 的速度限制?如果是這樣,究竟是什么導致了這種情況?我能讀 C,但我不能讀匯編,所以比較 C 的 asm 和 Go 的 asm 對我沒有太大作用,只是表明 Go 有大約 400 多行(忽略 .ascii 部分)。雖然我知道 Go 無法逐步匹配 C,但我不會假設(shè)速度會降低 4 倍。想法?這是 Go 的 cpuprofile:這是 C (編譯 w/ gcc -Wall -pedantic -O9)#include <stdio.h>#include <stdlib.h>#include <stdint.h>#include <string.h>#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#include <errno.h>#define BUFFER_SIZE (16 * 1024)intmain(){    const char *file = "big.txt";    int fd = open (file, O_RDONLY);    char buf[BUFFER_SIZE + 1];    uintmax_t bytes;    size_t bytes_read;    size_t lines;    posix_fadvise (fd, 0, 0, POSIX_FADV_SEQUENTIAL);    while ((bytes_read = safe_read (fd, buf, BUFFER_SIZE)) > 0)    {        char *p = buf;        // error checking        while ((p = memchr (p, '\n', (buf + bytes_read) - p)))          {            ++p;            ++lines;          }        bytes += bytes_read;    }    printf("%zu\n", bytes);    printf("%zu\n", lines);    return 0;}
查看完整描述

2 回答

?
森欄

TA貢獻1810條經(jīng)驗 獲得超5個贊

這是一種不太難也不太慢的方法,使用bytes.IndexByte(因為你發(fā)現(xiàn) Go 的 asm 實現(xiàn)有幫助)和syscall.Mmap:


package main


import (

    "bytes"

    "fmt"

    "log"

    "os"

    "syscall"

)


func main() {

    if len(os.Args) < 2 {

        log.Fatal("pass filename on command line")

    }

    f, err := os.Open(os.Args[1])

    if err != nil {

        log.Fatal("open: ", err)

    }

    stat, err := f.Stat()

    if err != nil {

        log.Fatal("stat: ", err)


    }

    data, err := syscall.Mmap(int(f.Fd()), 0, int(stat.Size()), syscall.PROT_READ, syscall.MAP_SHARED)

    if err != nil {

        log.Fatal("mmap: ", err)

    }

    newlines := 0

    for {

        i := bytes.IndexByte(data, 10)

        if i == -1 {

            break

        }

        newlines++

        data = data[i+1:]

    }

    fmt.Println(newlines)

}

Mmap 看起來很奇怪,但在這里就像您將文件讀入一個切片一樣,除了由于操作系統(tǒng)的幫助而占用的資源較少。


您可以在沒有太多工作的情況下并行計數(shù),但我不確定這是否值得。(amd64例如,如果單核計數(shù)受到內(nèi)存帶寬的限制,如果增益為零或負值,我不會感到震驚,但這對我來說測試速度并不快。)


查看完整回答
反對 回復 2021-09-13
  • 2 回答
  • 0 關(guān)注
  • 177 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號