From 24f11448f257596b77676491d86e6af1e1ab03db Mon Sep 17 00:00:00 2001 From: Adrien Moulin Date: Sun, 10 Jul 2022 13:50:01 +0200 Subject: [PATCH] Optimize hdd_image read/write About 30-40% speedup --- src/disk/hdd_image.c | 24 ++++++++---------------- 1 file changed, 8 insertions(+), 16 deletions(-) diff --git a/src/disk/hdd_image.c b/src/disk/hdd_image.c index eff860804..bccf13374 100644 --- a/src/disk/hdd_image.c +++ b/src/disk/hdd_image.c @@ -499,20 +499,16 @@ hdd_image_read(uint8_t id, uint32_t sector, uint32_t count, uint8_t *buffer) int non_transferred_sectors = mvhd_read_sectors(hdd_images[id].vhd, sector, count, buffer); hdd_images[id].pos = sector + count - non_transferred_sectors - 1; } else { - int i; - if (fseeko64(hdd_images[id].file, ((uint64_t)(sector) << 9LL) + hdd_images[id].base, SEEK_SET) == -1) { fatal("Hard disk image %i: Read error during seek\n", id); return; } - for (i = 0; i < count; i++) { - if (feof(hdd_images[id].file)) - break; - - hdd_images[id].pos = sector + i; - fread(buffer + (i << 9), 1, 512, hdd_images[id].file); + size_t num_read = fread(buffer, 512, count, hdd_images[id].file); + if (num_read != count) { + fatal("Hard disk image %i: Read error\n", id); } + hdd_images[id].pos = sector + num_read; } } @@ -555,20 +551,16 @@ hdd_image_write(uint8_t id, uint32_t sector, uint32_t count, uint8_t *buffer) int non_transferred_sectors = mvhd_write_sectors(hdd_images[id].vhd, sector, count, buffer); hdd_images[id].pos = sector + count - non_transferred_sectors - 1; } else { - int i; - if (fseeko64(hdd_images[id].file, ((uint64_t)(sector) << 9LL) + hdd_images[id].base, SEEK_SET) == -1) { fatal("Hard disk image %i: Write error during seek\n", id); return; } - for (i = 0; i < count; i++) { - if (feof(hdd_images[id].file)) - break; - - hdd_images[id].pos = sector + i; - fwrite(buffer + (i << 9), 512, 1, hdd_images[id].file); + size_t num_write = fwrite(buffer, 512, count, hdd_images[id].file); + if (num_write != count) { + fatal("Hard disk image %i: Write error\n", id); } + hdd_images[id].pos = sector + num_write; } }