From 8648908f72cc21f4aa4dbe3e1507b969e3bfab22 Mon Sep 17 00:00:00 2001 From: Jacek Sieka Date: Sun, 16 Jul 2023 10:24:02 +0200 Subject: [PATCH] avoid zeroMem on cached data, it doubles read time (!) --- stew/io2.nim | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/stew/io2.nim b/stew/io2.nim index 17cc7493..14c5b79c 100644 --- a/stew/io2.nim +++ b/stew/io2.nim @@ -1329,7 +1329,7 @@ proc setFilePos*(handle: IoHandle, offset: int64, else: ok() -proc checkFileSize*(value: int64): IoResult[void] = +proc checkFileSize*(value: int64): IoResult[int] = ## Checks if ``value`` fits into supported by Nim string/sequence indexing ## mechanism. ## @@ -1339,9 +1339,9 @@ proc checkFileSize*(value: int64): IoResult[void] = if value > 0x7FFF_FFFF'i64: err(UnsupportedFileSize) else: - ok() + ok(int(value)) elif sizeof(int) == 8: - ok() + ok(int(value)) proc readFile*[T: byte|char](pathName: string, data: var openArray[T]): IoResult[uint] = @@ -1365,9 +1365,16 @@ proc readFile*[T: byte|char](pathName: string, proc readFile*[T: seq[byte]|string](pathName: string, data: var T): IoResult[void] = ## Read all data from file ``pathName`` and store it to ``data``. - let fileSize = ? getFileSize(pathName) - ? checkFileSize(fileSize) - data.setLen(fileSize) + let + fileSize = ? getFileSize(pathName) + memSize = ? checkFileSize(fileSize) + + if data.len() != memSize: + # `zeroMem` creates a measurable performance degradation here + when data is seq[byte]: + data = newSeqUninitialized[byte](memSize) + else: + data = newString(memSize) let res {.used.} = ? readFile(pathName, data.toOpenArray(0, len(data) - 1)) ok()