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

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

為什么使用 syscall.O_DIRECT 標(biāo)志寫入文件會(huì)使寫入文件變慢?

為什么使用 syscall.O_DIRECT 標(biāo)志寫入文件會(huì)使寫入文件變慢?

Go
HUH函數(shù) 2022-12-19 20:00:42
我有一小段代碼,名為test.go. 它在執(zhí)行兩次寫入時(shí)計(jì)算時(shí)間(ns),將相同的字節(jié)片寫入 2 個(gè)文件,一個(gè)帶有標(biāo)志syscall.O_DIRECT,另一個(gè)沒有。代碼如下:package main;import (        "os"        "time"        "fmt"        "strconv"        "bytes"        "syscall"        // "os/exec")func main() {        num, _ := strconv.Atoi(os.Args[1]);        writeContent:= bytes.Repeat( ([]byte)("1"), num );        t1:= time.Now().UnixNano();        fd1, err := syscall.Open("abc.txt", syscall.O_WRONLY | syscall.O_DIRECT | syscall.O_TRUNC, 0);        syscall.Write(fd1, writeContent);        if err != nil {panic(err);}        t2:= time.Now().UnixNano();        fmt.Println("sysW1:", t2-t1);        t1= time.Now().UnixNano();        fd2, err := syscall.Open("abc.txt", syscall.O_WRONLY | syscall.O_TRUNC, 0);        syscall.Write(fd2, writeContent);        if err != nil {panic(err);}        t2= time.Now().UnixNano();        fmt.Println("sysW2:", t2-t1);}該程序在 linux 命令行中運(yùn)行,如下所示:(編譯后go build ./test.go)./test 1024我原以為寫有標(biāo)志syscall.O_DIRECT的文件會(huì)更快,但結(jié)果表明寫有syscall.O_DIRECT標(biāo)志的文件比沒有它的寫慢大約30倍:(結(jié)果:sysW1: 1107377sysW2: 37155為什么?我認(rèn)為使用 syscall.O_DIRECT 進(jìn)行編寫會(huì)減少復(fù)制并且會(huì)更快,但現(xiàn)在證明它要慢得多。請(qǐng)幫我解釋一下:(PX:我不會(huì)提供游樂場鏈接,因?yàn)樵谟螛穲鲞\(yùn)行程序時(shí)由于某些原因總是返回0。
查看完整描述

1 回答

?
白衣染霜花

TA貢獻(xiàn)1796條經(jīng)驗(yàn) 獲得超10個(gè)贊

O_DIRECT沒有按照你的想法去做。雖然它減少了內(nèi)存復(fù)制(因?yàn)樗粫?huì)在復(fù)制到設(shè)備驅(qū)動(dòng)程序之前復(fù)制到緩存),但這并不能提高性能。

文件系統(tǒng)緩存確保系統(tǒng)調(diào)用可以在數(shù)據(jù)寫入設(shè)備之前盡早返回,并緩沖數(shù)據(jù)以更大的塊發(fā)送數(shù)據(jù)。

使用O_DIRECT,系統(tǒng)調(diào)用會(huì)一直等待,直到數(shù)據(jù)完全傳輸?shù)皆O(shè)備。

呼叫的手冊(cè)頁open

O_DIRECT(自 Linux 2.4.10 起)

盡量減少進(jìn)出此文件的 I/O 的緩存效應(yīng)。 通常這會(huì)降低性能,但在特殊情況下很有用,例如當(dāng)應(yīng)用程序進(jìn)行自己的緩存時(shí)。文件 I/O 直接從用戶空間緩沖區(qū)完成。O_DIRECT標(biāo)志本身努力同步傳輸數(shù)據(jù),但不保證O_SYNC數(shù)據(jù)和必要的元數(shù)據(jù)被傳輸。

另請(qǐng)參閱:O_DIRECT 的真正含義是什么?

使用后無需手動(dòng)釋放緩存。緩存被 Linux 內(nèi)核視為可用的可用內(nèi)存。如果進(jìn)程需要緩存占用的內(nèi)存,內(nèi)核將在此時(shí)刷新/釋放緩存。緩存不會(huì)“用完”內(nèi)存。


查看完整回答
反對(duì) 回復(fù) 2022-12-19
  • 1 回答
  • 0 關(guān)注
  • 154 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

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