В моем приложении у меня около 300 NSData
объектов размером 0,5 МБ, и я записываю их последовательно в файл по существу с этим кодом (который записывает один объект размером 0,5 МБ 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 секунд, и мне было интересно, есть ли какой-нибудь более быстрый способ сделать это. Я пробовал использовать подходы NSFileManager
и NSFileHandle
, но они занимают примерно один и тот же отрезок времени, что приводит меня к предположению, что это фундаментальный предел ввода-вывода, в котором я работаю.
Есть ли способ сделать это быстрее (этот код должен компилироваться и запускаться на любом устройстве)?