gpt4 book ai didi

ios - 有什么方法可以加速这个文件 I/O 代码吗?

转载 作者:IT王子 更新时间:2023-10-29 08:20:38 24 4
gpt4 key购买 nike

在我的应用程序中,我有大约 300 个大小为 0.5 MB 的 NSData 对象,我将它们全部按顺序写入一个文件,基本上是这个代码(写入一个 0.5 MB 的对象 300 次):

- (void)createFile {

// create .5 MB block to write
int size = 500000;
Byte *bytes = malloc(size);
for (int i = 0; i < size; i++) {
bytes[i] = 42;
}
NSData *data = [NSData dataWithBytesNoCopy:bytes length:size
freeWhenDone:YES];

// temp output file
NSUUID *uuid = [NSUUID UUID];
NSString *path = [[NSTemporaryDirectory()
stringByAppendingPathComponent:[uuid UUIDString]]
stringByAppendingPathExtension:@"dat"];
NSOutputStream *outputStream = [[NSOutputStream alloc]
initToFileAtPath:path append:NO];
[outputStream open];

double startTime = CACurrentMediaTime();

NSInteger totalBytesWritten;
NSInteger bytesWritten;
Byte *readPtr;

for (int i = 0; i < 300; i++) {

// reset read pointer to block we're writing to the output
readPtr = (Byte *)[data bytes];
totalBytesWritten = 0;

// write the block
while (totalBytesWritten < size) {
bytesWritten = [outputStream write:readPtr maxLength:size
- totalBytesWritten];
readPtr += bytesWritten;
totalBytesWritten += bytesWritten;
}

}

double duration = CACurrentMediaTime() - startTime;
NSLog(@"duration = %f", duration);

[outputStream close];

}

在我的 iPod(第 5 代)和我的 iPhone 6 上,这个过程大约需要 3 秒,我想知道是否有更快的方法来完成这个过程。我试过使用 NSFileManagerNSFileHandle 方法,但它们花费的时间大致相同,这让我假设这是我的基本 I/O 限制我遇到了。

有什么方法可以更快地做到这一点(这段代码应该可以在任何设备上编译和运行)?

最佳答案

这是我使用 mmap 和 memcpy 能够实现的最高性能。

在我的 iPhone 6 上运行平均需要大约 0.2 秒,最高可达 0.5 秒左右。然而,YMMV,因为 iPhone 6 似乎有两个不同的闪存供应商 - 一个是 TLC,另一个是 MLC - 使用 TLC 的供应商将获得明显更好的结果。

这当然假设您对异步 I/O 没问题。如果您确实需要同步的东西,请寻找其他解决方案。

- (IBAction)createFile {
NSData *data = [[self class] dataToCopy];

// temp output file
NSUUID *uuid = [NSUUID UUID];
NSString *path = [[NSTemporaryDirectory()
stringByAppendingPathComponent:[uuid UUIDString]]
stringByAppendingPathExtension:@"dat"];

NSUInteger size = [data length];
NSUInteger count = 300;

NSUInteger file_size = size * count;

int fd = open([path UTF8String], O_CREAT | O_RDWR, 0666);
ftruncate(fd, file_size);

void *addr = mmap(NULL, file_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);

double startTime = CACurrentMediaTime();
static dispatch_queue_t concurrentDataQueue;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
concurrentDataQueue = dispatch_queue_create("test.concurrent", DISPATCH_QUEUE_CONCURRENT);
});

for (int i = 0; i < count; i++) {
dispatch_async(concurrentDataQueue, ^{
memcpy(addr + (i * size), [data bytes], size);
});
}

dispatch_barrier_async(concurrentDataQueue, ^{
fsync(fd);

double duration = CACurrentMediaTime() - startTime;
NSLog(@"duration = %f", duration);

munmap(addr, file_size);
close(fd);
unlink([path UTF8String]);
});
}

关于ios - 有什么方法可以加速这个文件 I/O 代码吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30678597/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com