一致する組み合わせの配列を生成する必要がある PhoneGap モバイル アプリケーションがあります。JavaScript 側では、組み合わせが生成される配列が少し大きくなると、すぐにコードがハングアップしました。そこで、プラグインを作成して組み合わせを生成し、javascript オブジェクトの配列をネイティブ側に渡してそこでループさせようと考えました。
驚いたことに、次のコードは 150 ミリ秒 (JavaScript) で実行されますが、ネイティブ側 (Objective-C) では約 1000 ミリ秒かかります。
これらの実行時間を短縮するためのヒントを知っている人はいますか? プレイヤーが 10 人を超えると、つまり、チームの配列の長さが 252 に等しくなると、実際に遅くなります。上記の実行時間は、10 プレイヤー / 252 チームの場合です。
JavaScript コードは次のとおりです。
for (i = 0; i < GAME.teams.length; i += 1) {
for (j = i + 1; j < GAME.teams.length; j += 1) {
t1 = GAME.teams[i];
t2 = GAME.teams[j];
if ((t1.mask & t2.mask) === 0) {
GAME.matches.push({
Team1: t1,
Team2: t2
});
}
}
}
...そしてこれがネイティブコードです:
NSArray *teams = [[NSArray alloc] initWithArray: [options objectForKey:@"teams"]];
NSMutableArray *t = [[NSMutableArray alloc] init];
int mask_t1;
int mask_t2;
for (NSInteger i = 0; i < [teams count]; i++) {
for (NSInteger j = i + 1; j < [teams count]; j++) {
mask_t1 = [[[teams objectAtIndex:i] objectForKey:@"mask"] intValue];
mask_t2 = [[[teams objectAtIndex:j] objectForKey:@"mask"] intValue];
if ((mask_t1 & mask_t2) == 0) {
[t insertObject:[teams objectAtIndex:i] atIndex:0];
[t insertObject:[teams objectAtIndex:j] atIndex:1];
/*
NSArray *newCombination = [[NSArray alloc] initWithObjects:
[teams objectAtIndex:i],
[teams objectAtIndex:j],
nil];
*/
[combinations addObject:t];
}
}
}
... 問題の配列 (GAME.teams) は次のようになります。
{
count = 2;
full = 1;
list = (
{
index = 0;
mask = 1;
name = A;
score = 0;
},
{
index = 1;
mask = 2;
name = B;
score = 0;
}
);
mask = 3;
name = A;
},
{
count = 2;
full = 1;
list = (
{
index = 0;
mask = 1;
name = A;
score = 0;
},
{
index = 2;
mask = 4;
name = C;
score = 0;
}
);
mask = 5;
name = A;
},