亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

快速去除UTF-8 BOM

zhangke3016 / 2871人閱讀

摘要:后文所用的測(cè)試文件是一個(gè)阿里云導(dǎo)出的文件,,測(cè)試時(shí)文件已緩存顯示的接近用去用看一下方法耗時(shí)較大,因?yàn)闀?huì)對(duì)每一行都進(jìn)行處理,但是實(shí)際上只有第一行有,所以浪費(fèi)了。

工作中多多少少都會(huì)遇到UTF-8 BOM(后面直接叫BOM),有時(shí)第三方工具不支持就要自己去掉BOM,例如阿里云導(dǎo)出的SQL文件是有BOM的,但是Navicat不支持,這就要去掉BOM了。

后文所用的測(cè)試文件是一個(gè)阿里云導(dǎo)出的SQL文件,265M,測(cè)試時(shí)文件已緩存(time顯示的 File system inputs接近0)

用sed去BOM
sed -e "1s/^xefxbbxbf//" file

用time看一下sed方法耗時(shí):

$ /usr/bin/time -v sed -e "1s/^xefxbbxbf//" sqlResult_1601835.sql > /dev/null
        ...
        User time (seconds): 0.33
        System time (seconds): 0.11
        Percent of CPU this job got: 98%
        Elapsed (wall clock) time (h:mm:ss or m:ss): 0:00.46
        ...

User time較大,因?yàn)閟ed會(huì)對(duì)每一行都進(jìn)行處理,但是實(shí)際上只有第一行有BOM,所以浪費(fèi)了CPU。

sed還支持原地更新(-i):

$ /usr/bin/time -v sed -e "1s/^xefxbbxbf//" sqlResult_1601835.sql -i
        ...
        User time (seconds): 1.31
        System time (seconds): 3.89
        Percent of CPU this job got: 71%
        Elapsed (wall clock) time (h:mm:ss or m:ss): 0:07.32
        ...

因?yàn)闀?huì)寫入文件,所以會(huì)更慢,用strace可以發(fā)現(xiàn),sed是通過輸出到臨時(shí)文件然后覆蓋原文件實(shí)現(xiàn)更新的

open("sqlResult_1601835.sql", O_RDONLY) = 3
open("./sedGlXm60", O_RDWR|O_CREAT|O_EXCL, 0600) = 4
...
rename("./sedGlXm60", "sqlResult_1601835.sql")
用tail去BOM
tail --bytes=+4 file

用tail可以直接跳過BOM,然后直接復(fù)制文件內(nèi)容,減少了不必要的CPU處理:

$ /usr/bin/time -v tail --bytes=+4 sqlResult_1601835.sql > /dev/null
        ...
        User time (seconds): 0.01
        System time (seconds): 0.12
        Percent of CPU this job got: 96%
        Elapsed (wall clock) time (h:mm:ss or m:ss): 0:00.14
        ...

但是tail必須自己重定向到新文件再覆蓋舊文件。

strip-bom

為了結(jié)合sed和tail的優(yōu)點(diǎn),我寫了一個(gè)strip-bom,支持原地更新文件。

先測(cè)試一下重定向:

$ /usr/bin/time -v php strip-bom.phar sqlResult_1601835.sql > /dev/null
        ...
        User time (seconds): 0.11
        System time (seconds): 0.22
        Percent of CPU this job got: 98%
        Elapsed (wall clock) time (h:mm:ss or m:ss): 0:00.35
        ...

只比sed快了20%,User time少了但System time增加了。因?yàn)槭莻€(gè)循環(huán)讀寫的過程,每次循環(huán)就是一次read和write調(diào)用,所以我增加了一個(gè)參數(shù)來調(diào)節(jié)每次讀的塊大小,可以減少循環(huán)次數(shù)和系統(tǒng)調(diào)用,可以比sed快60%:

$ /usr/bin/time -v php strip-bom.phar -b 16384 sqlResult_1601835.sql > /dev/null
        ...
        User time (seconds): 0.06
        System time (seconds): 0.12
        Percent of CPU this job got: 96%
        Elapsed (wall clock) time (h:mm:ss or m:ss): 0:00.19

測(cè)試原地更新,比sed快30%:

$ /usr/bin/time -v php strip-bom.phar -i -b 16384 sqlResult_1601835.sql
        User time (seconds): 0.23
        System time (seconds): 0.67
        Percent of CPU this job got: 17%
        Elapsed (wall clock) time (h:mm:ss or m:ss): 0:05.11
copy_file_range

Linux 4.5增加了一個(gè)系統(tǒng)調(diào)用:

ssize_t copy_file_range(int fd_in, loff_t *off_in,
                               int fd_out, loff_t *off_out,
                               size_t len, unsigned int flags);

可以直接在兩個(gè)文件描述符間復(fù)制內(nèi)容,而且通常只要一個(gè)系統(tǒng)調(diào)用,所以可以參考sed復(fù)制到臨時(shí)文件,然后覆蓋舊文件,實(shí)現(xiàn)代碼在:Gist

測(cè)試:

$ /usr/bin/time -v ./copy_file_range sqlResult_1601835.sql
        ...
        User time (seconds): 0.00
        System time (seconds): 2.47
        Percent of CPU this job got: 37%
        Elapsed (wall clock) time (h:mm:ss or m:ss): 0:06.52

減少了系統(tǒng)調(diào)用也只比sed快一點(diǎn),復(fù)制到臨時(shí)文件還是比strip-bom原地更新慢。

dos2unix去BOM

一直以為dos2unix就是轉(zhuǎn)CRLF的,看Feng_Yu評(píng)論之后看了man page,原來dos2unix功能很多,其中有去BOM的選項(xiàng)(-r):

$ /usr/bin/time -v dos2unix -r sqlResult_1601835.sql
dos2unix: 正在轉(zhuǎn)換文件 sqlResult_1601835.sql 為Unix格式...
        Command being timed: "dos2unix -r sqlResult_1601835.sql"
        User time (seconds): 10.01
        System time (seconds): 0.90
        Percent of CPU this job got: 60%
        Elapsed (wall clock) time (h:mm:ss or m:ss): 0:18.20

dos2unix實(shí)現(xiàn)類似sed,也是寫到臨時(shí)文件再覆蓋,也和sed一樣,會(huì)處理每一行,所以性能并不好。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/26272.html

相關(guān)文章

  • 代碼組織和部署 文件操作 node.js

    代碼組織和部署 模塊的路徑解析規(guī)則 require支持/或者盤符的絕對(duì)路徑,也支持./開頭的相對(duì)地址同時(shí)require也支持第三種寫法 內(nèi)置模塊 如果傳遞給require的函數(shù)是node.js的內(nèi)置模塊,將會(huì)不做路徑解析,直接返回內(nèi)部exports模塊要導(dǎo)出的對(duì)象 node_modules目錄 node.js定義一個(gè)node_modules存放模塊,每次使用foo/bar的方式的時(shí)候,會(huì)先尋找該目...

    Cc_2011 評(píng)論0 收藏0
  • 記一次由BOM引起的bug

    摘要:今天團(tuán)隊(duì)小伙伴給了我一個(gè)配置文件,可以用如下替代畢竟內(nèi)容不是重點(diǎn)考慮到這個(gè)并不需要常駐,就沒有用來引用,因?yàn)槟K的緩存機(jī)制,勢(shì)必會(huì)導(dǎo)致內(nèi)存泄漏問題的發(fā)生,就采取了以下方式但是詭異的事情發(fā)生了,竟然報(bào)錯(cuò)了此時(shí)一臉懵逼,就用了的方式試了一下發(fā)現(xiàn) bug 今天團(tuán)隊(duì)小伙伴給了我一個(gè)json配置文件,可以用如下替代(畢竟內(nèi)容不是重點(diǎn)): { text: this is a example...

    cc17 評(píng)論0 收藏0
  • Java 跨域 Json字符轉(zhuǎn)類對(duì)象

    摘要:前言對(duì)于從其他服務(wù)器的獲得數(shù)據(jù),我們一般都為數(shù)據(jù)傳輸,比如服務(wù)器要從服務(wù)器的獲得分頁(yè)信息,得到字符后如果可以方便快捷操作要轉(zhuǎn)為自己的對(duì)象。第二種是的,這種就是無(wú)報(bào)錯(cuò),但是對(duì)象的值一直為空。把值傳進(jìn)去去除報(bào)頭測(cè)試結(jié)果是成給對(duì)象賦值了 前言 對(duì)于從其他服務(wù)器的url獲得數(shù)據(jù),我們一般都為json數(shù)據(jù)傳輸,比如服務(wù)器B要從服務(wù)器A的url獲得分頁(yè)信息,得到j(luò)son字符后如果可以方便快捷操作要...

    blastz 評(píng)論0 收藏0
  • 網(wǎng)站常見安全問題記錄(持續(xù)更新)

    摘要:由此造成即使頁(yè)面的或者設(shè)置為,也無(wú)法讓整個(gè)網(wǎng)頁(yè)緊貼瀏覽器頂部,因?yàn)樵谝婚_頭有這個(gè)隱藏字符解決辦法保存文件為建議不要用記事本打開開發(fā)文件 說明 初衷: 本文檔用于記錄所遇到的網(wǎng)站安全問題,并分類匯總,方便后期遇到類似問題,能夠快速找到解決方案,提高效率,讓程序員有更多的時(shí)間去把妹,LOL... 記錄規(guī)范: 標(biāo)題必須清晰明了,方便用戶快速查找,拒絕標(biāo)題黨; 問題放到正確的分類中; 記錄問...

    Jason_Geng 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<