如何在 JS 中快速讀取文件

本文翻譯自 How to read files quickly in JavaScript,作者:Daniel Lemire, 略有刪改。

假設你需要在服務器上使用JavaScript讀取多個文件。在像Node.js這樣的運行時環境中,JavaScript有多種讀取文件的方式。哪一種是最好的呢?讓我們來看看各種方法的測試結果。

使用fs. promise

const fs = require('fs/promises');
const readFile = fs.readFile;
readFile("lipsum.txt", { encoding: 'utf-8' }).then((data) => {...}).catch((err) => {...})

使用fs.readFile和util.promisify

const fs = require('fs');
const util = require('util');
const readFile = util.promisify(fs.readFile);
readFile("lipsum.txt", { encoding: 'utf-8' })  .then((data) => {...}).catch((err) => {...})

使用fs.readFileSync

const fs = require('fs');
const readFileSync = fs.readFileSync;
var data = readFileSync("lipsum.txt", { encoding: 'utf-8' })

使用await fs.readFileSync

const fs = require('fs');
const readFileSync = fs.readFileSync;
async function f(name, options) {return readFileSync(name, options);
}

使用fs.readFile

const fs = require('fs');
const readFile = fs.readFile;
fs.readFile('lipsum.txt', function read(err, data) {...});

測試

我寫了一個小型基準測試,用于反復從磁盤讀取文件。這是一個簡單的循環,每次都會訪問相同的文件。我記錄了讀取文件5萬次所需的毫秒數。這個文件相對較小(略超過1千字節)。我使用的是一臺擁有數十個Ice Lake Intel核心和大量內存的大型服務器。我使用的Node.js版本是20.1,Bun版本是1.0.14

我多次運行了基準測試,并且在所有情況下都記錄了最好的結果。你的結果可能會有所不同。

時間(Node.js)時間(Bun)
fs.promises2400 ms110 ms
fs.readFile和util.promisify1500 ms180 ms
fs.readFileSync140 ms140 ms
await fs.readFileSync220 ms180 ms
fs.readFile760 ms90 ms

至少在我的系統上,在這個測試中使用Node.js時,fs.promises比其他方式都要慢的多。在這個測試中Bun比Node.js快得多。

從某種意義上來說,fs.promises 的結果比看上去更差。我發現 readFileSync 使用了 300 毫秒的 CPU 時間,而 fs.promises 卻使用了 7 秒的 CPU 時間。這是因為在進行基準測試時,fs.promises 在多個核心上觸發了工作。

即使將文件大小增加到32kB,結論也并沒有改變。如果你使用更大的文件,許多Node.js案例會因為“堆內存分配失敗”而失敗。但Bun即使處理大文件也能繼續運行。測試結果并沒有改變關于Bun的結論:在我的測試中,fs.readFile始終更快,即使對于大文件也是如此。


看完本文如果覺得有用,記得點個贊支持,收藏起來說不定哪天就用上啦~

專注前端開發,分享前端相關技術干貨,公眾號:南城大前端(ID: nanchengfe)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/20672.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/20672.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/20672.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Linux軟件安裝包rpm與tgz格式的區別

rpm與tgz的區別 1、Linux軟件包的內容分類2、Linux軟件包的格式分類 1、Linux軟件包的內容分類 Linux應用程序的軟件包按內容類別可分為兩類: 可執行文件(編譯后的二進制軟件包) 解包后可以直接運行,看不到源代碼。例如&#xff0…

基于Springboot駕校預約平臺小程序的設計與實現(源碼+數據庫+文檔)

一.項目介紹 系統角色:管理員、教練、學員 小程序(僅限于學員注冊、登錄): 查看管理員發布的公告信息 查看管理員發布的駕校信息 查看所有教練信息、預約(需教練審核)、評論、收藏喜歡的教練 查看管理員發布的考試信息、預約考試(需管理…

代碼隨想錄算法訓練營Day8|541. 反轉字符串II、替換數字、151.翻轉字符串里的單詞、卡碼網:55.右旋轉字符串

541. 反轉字符串II 1.這道題剛開始把題意理解錯了,以為對于任意長度的字符串都只反轉[0,k-1]以及[2k,3k-1]區間的值。 2.但實際上是要把一個字符串分成若干長度為2k的小區間,反轉前[0,k-1]的字符串,[k,2k-1]保持不變; 3.如果有一個區間字符串…

2024年東北師范CCPC

文章目錄 A.Paper WateringB.nIM gAMEE.Checksum A.Paper Watering 思路:題目說有平方和開方兩種操作,如果這個數是平方數,那么它開方之后就只能開方,如果平方的話就重復了,反之就有開方和平方兩種操作。 代碼如下 //…

為了方便看公眾號文章,我搭建了個博客,在線看公眾號所有歷史文章,想看哪天的文章一秒就能找到

公眾號沒有個網頁版的文章列表,只能在電腦和手機客戶端看,想看之前的歷史文章只能一直往下拉,想找某篇文章非常費勁。 為了方便看公眾號文章,我搭建了個博客,博客地址https://sushengbuhuo.github.io/blog &#xf…

通過 SFP 接口實現千兆光纖以太網通信1

基于米聯客ARTIX-7 系列開發板及其開發手冊。 總體實現框圖如下: SFP 接口 SFP 信號定義如下圖所示。 Tri Mode Ethernet MAC 設置 由于使用千兆通訊,因此將速率設為 1Gbps。如下圖所示。 首先,由于該 IP 需要與 IP 核 1G/2.5G Ethernet …

基于IoTDB 平臺的學習和研究

Apache IoTDB(物聯網數據庫)是一個針對物聯網領域的高性能原生數據庫,適用于數據管理和分析,并可在邊緣計算和云端部署。由于它輕量級的架構、高性能和豐富的功能集,以及與Apache Hadoop、Spark和Flink的深度集成&…

【面試】生成class文件的編譯器有哪些?

目錄 1. 說明2. javac3. IDE(集成開發環境)中的編譯器3.1 Eclipse編譯器3.2 IntelliJ IDEA編譯器 1. 說明 1.javac和IDE中的編譯器是最常用的和主要的。2.這些編譯器都能夠將Java源代碼編譯為可在JVM上執行的字節碼文件,是實現Java跨平臺特性的關鍵。3.選擇編譯器時…

數據管理知識體系必知的14張語境關系圖

近期對數據管理知識體系中的語境關系圖進行了整體學習梳理,總共有14張圖,具體如下,供大家參考。應該說語境關系圖和環境因素六邊形圖是各有側重、互為補充關系。語境關系圖是環境因素六邊形圖的細化,描述了每個知識領域中的細節,相當于數據管理的微觀視角, 包括與人員、 …

kali中切換python版本

kali中切換python版本 在日常使用的過程中,可以通過一些工具來做打靶環境,或者工具的啟動,都和python關聯,而有時存在工具安裝,或者運行的時候出現報錯,這時候極大可能是因為我們本地的kali中python的版本不…

Android Studio | 小白如何運行別人的安卓項目

目錄 Step1:正確地打開項目 Step2:AS 同步時報錯 Step3:同步完成后啟動 Step4:啟動成功 說明:本文簡稱 Android Studio 為 AS Step1:正確地打開項目 重點:確認好項目的根目錄是哪個目錄&am…

進程與線程(三)

進程與線程(三) 進程間通信傳統間的進程間通信機制無名管道無名管道的特征無名管道的創建父子進程通信測試管道的大小管道讀寫易出現的問題 有名管道創建有名管道有名管道的寫端代碼有名管道的讀端代碼 信號信號的特征產生信號硬件來源軟件來源發送信號的…

Linux chmod 命令

Linux chmod 命令 在 Linux 操作系統中,chmod 命令是非常重要的。它可以用于修改文件和目錄的訪問權限,以及控制用戶對系統資源的訪問。在這篇博客中,我們將深入探討 chmod 命令的使用方法,以及如何使用它來管理文件和目錄的訪問…

什么是主碼,什么是候選碼,主碼的候選碼的區別是什么

目錄 一、候選碼 (Candidate Key) 1.定義 2.特點 二、主碼 (Primary Key) 1.定義 2.特點 三、關系和區別 1.關系 2.區別 一、候選碼 (Candidate Key) 1.定義 候選碼是能夠唯一標識數據庫表中每一條記錄的屬性集合。一個表可以有一個或多個候選碼。 2.特點 每個候選…

【U-Boot 源碼深度解析】000 - 文章鏈接匯總

【U-Boot 源碼深度解析】000 - 文章鏈接匯總 下載鏈接 https://ftp.denx.de/pub/u-boot/ 《【U-Boot 源碼深度解析】001 - Ubuntu 24.04 虛擬機 及 基礎環境搭建》

ORACLE RAC的一些基本理論知識

一 . Oracle RAC 的發展歷程 1. Oracle Parallel Server (OPS) 早期階段:Oracle 6 和 7 Oracle Parallel Server(OPS)是 Oracle RAC 的前身。 通過多個實例并行訪問同一個數據庫來提高性能。 共享磁盤架構,利用分布式鎖管理&am…

JZ2440筆記:Nor FLASH驅動程序

(1)測試原有的驅動: make menuconfig修改physmap-flash驅動配置:起始0,大小0x100000,位寬2,make modules后拷貝過去測試: # insmod physmap.ko physmap platform flash device: 01000000 at 00000000 phy…

C#面:解釋什么是viewstate,能否禁用?是否所用控件都可以禁用

在C#中,ViewState是 ASP.NET Web Forms中的一個重要概念。它用于在Web應用程序中跨頁面請求之間保存和恢復頁面的狀態數據。ViewState的主要目的是在頁面回發(postback)期間保持頁面上的控件狀態,以便在頁面重新加載后能夠正確地還…

addEventListener()方法中的幾個參數,以及作用

addEventListener() 方法是 JavaScript 中用于處理指定元素的指定事件的函數。它有三個參數: type(必需):一個字符串,指定要監聽的事件名。 listener(必需):一個實現了 EventListen…

【第1章】SpringBoot實戰篇之注冊接口

文章目錄 前言一、代碼部分1. User2.UserMapper13. UserSerivce4. UserController15. Result 二、測試1.注冊2.再次注冊 總結 前言 下面介紹用戶注冊接口。 一、代碼部分 1. User package org.example.springboot3.bigevent.entity;import com.baomidou.mybatisplus.annotat…