4

2012-11-10, 2012-11-11, , …とカウントされるように、ループで何日もインクリメントしたいと思い2012-11-12ます</p>

これを達成するための最もパフォーマンスの高い方法は何ですか?

NSDate *iterationDate = [NSDate date];

for (int i = 0; i < 100; i++) {
    NSDateComponents *comps = [[NSDateComponents alloc] init];
    [comps setYear:0];
    [comps setMonth:0];
    [comps setWeek:0];
    [comps setDay:1];
    [comps setHour:0];
    [comps setMinute:0];
    [comps setSecond:0];
    iterationDate = [currentCalendar dateByAddingComponents:comps toDate:iterationDate options:0];
}
4

2 に答える 2

3

NSDateすべての中間sが必要な場合compsは、ループから抜けてください。

NSDate *iterationDate = [NSDate date];
NSDateComponents *comps = [[NSDateComponents alloc] init];
[comps setYear:0];
[comps setMonth:0];
[comps setWeek:0];
[comps setDay:1];
[comps setHour:0];
[comps setMinute:0];
[comps setSecond:0];

for (int i = 0; i < 100; i++) {
    iterationDate = [currentCalendar dateByAddingComponents:comps toDate:iterationDate options:0];
}

CoreFoundation API を使用して同様のことを実現できます。

CFCalendarRef calendar = CFCalendarCreateWithIdentifier(0, kCFGregorianCalendar);
CFAbsoluteTime at = CFAbsoluteTimeGetCurrent();
const CFOptionFlags options = 0;
for (int i = 0; i < NIter; ++i) {
    if (0 == CFCalendarAddComponents(calendar, &at, options, "d", 1)) {
        assert(0 && "uh-oh");
    }
    CFDateRef date = CFDateCreate(0, at);
    // store result
    CFRelease(date);
}
CFRelease(calendar);

これは、Foundation よりも 33% 高速であることが測定されました。CFDates を作成する必要がなく、単にCFAbsoluteTime値を保存できる場合は、さらに高速です。

于 2012-11-10T08:42:24.423 に答える
2

NSDateComponentsあなたのやり方は悪くないと思います。オブジェクトを毎回割り当てないでください( comps):

NSDate *iterationDate = [NSDate date];
NSDateComponents *comps = [[NSDateComponents alloc] init];
[comps setDay:1];
for (int i = 0; i < 100; i++) 
    iterationDate = [currentCalendar dateByAddingComponents:comps toDate:iterationDate options:0];

別の方法が考えられます(これはより高速である必要がありますが、テストする必要があります...):

NSDate *iterationDate = [NSDate date];
int daysToAdd = 1;  
for (int i = 0; i < 100; i++)
       iterationDate = [iterationDate addTimeInterval:60*60*24*daysToAdd];
于 2012-11-10T08:42:17.667 に答える