Objective-C与JavaScript循环性能
我有一个PhoneGap移动应用程序,需要生成一系列匹配组合。在JavaScript方面,当生成组合的数组变大时,代码很快就会挂起。所以,我想我将制作一个插件来生成组合,将javascript对象数组传递到本机端并在那里循环 令我惊讶的是,以下代码执行时间为150毫秒(JavaScript),而在本机端(Objective-C)执行时间约为1000毫秒 有人知道加快执行时间的技巧吗?当玩家超过10人时,即队伍长度等于252时,速度会变慢。上述执行时间为10名球员/252支球队 下面是JavaScript代码:Objective-C与JavaScript循环性能,javascript,objective-c,performance,loops,combinations,Javascript,Objective C,Performance,Loops,Combinations,我有一个PhoneGap移动应用程序,需要生成一系列匹配组合。在JavaScript方面,当生成组合的数组变大时,代码很快就会挂起。所以,我想我将制作一个插件来生成组合,将javascript对象数组传递到本机端并在那里循环 令我惊讶的是,以下代码执行时间为150毫秒(JavaScript),而在本机端(Objective-C)执行时间约为1000毫秒 有人知道加快执行时间的技巧吗?当玩家超过10人时,即队伍长度等于252时,速度会变慢。上述执行时间为10名球员/252支球队 下面是JavaSc
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
});
}
}
}
一般来说,当你遇到性能问题时,你应该使用时间分析器工具来评测你的应用程序 在这种情况下,我可以看到一些可能的问题 首先,您在内部循环中执行以下操作:
[t insertObject:[teams objectAtIndex:i] atIndex:0];
[t insertObject:[teams objectAtIndex:j] atIndex:1];
您只是在t
对象的开头插入了越来越多的对象。你永远不会把它清空。我很确定这不是你想要的,这可能也是一个性能问题
其次,你发送了很多不必要的信息。例如,您要提取掩码O(N2)次。您可以通过一次提取所有遮罩来优化此操作
NSArray *teams = [options objectForKey:@"teams"];
NSUInteger teamCount = teams.count;
int masks[teamCount];
for (NSUInteger i = 0; i < teamCount; ++i) {
masks[i] = [[teams[i] objectForKey:@"mask"] intValue];
}
NSMutableArray *matches = [[NSMutableArray alloc] init];
for (NSUInteger i = 0; i < teamCount; ++i) {
for (NSUInteger j = i + 1; j < teamCount; ++j) {
if ((masks[i] & masks[j]) == 0) {
[matches addObject:@[teams[i], teams[j]]];
}
}
}
NSArray*teams=[options objectForKey:@“teams”];
NSU整数teamCount=teams.count;
整数掩码[团队计数];
对于(i=0;i
您仍在进行O(N2)次迭代,但每次迭代所做的工作要少得多。通常,当您遇到性能问题时,您应该使用时间分析器工具来评测应用程序 在这种情况下,我可以看到一些可能的问题 首先,您在内部循环中执行以下操作:
[t insertObject:[teams objectAtIndex:i] atIndex:0];
[t insertObject:[teams objectAtIndex:j] atIndex:1];
您只是在t
对象的开头插入了越来越多的对象。你永远不会把它清空。我很确定这不是你想要的,这可能也是一个性能问题
其次,你发送了很多不必要的信息。例如,您要提取掩码O(N2)次。您可以通过一次提取所有遮罩来优化此操作
NSArray *teams = [options objectForKey:@"teams"];
NSUInteger teamCount = teams.count;
int masks[teamCount];
for (NSUInteger i = 0; i < teamCount; ++i) {
masks[i] = [[teams[i] objectForKey:@"mask"] intValue];
}
NSMutableArray *matches = [[NSMutableArray alloc] init];
for (NSUInteger i = 0; i < teamCount; ++i) {
for (NSUInteger j = i + 1; j < teamCount; ++j) {
if ((masks[i] & masks[j]) == 0) {
[matches addObject:@[teams[i], teams[j]]];
}
}
}
NSArray*teams=[options objectForKey:@“teams”];
NSU整数teamCount=teams.count;
整数掩码[团队计数];
对于(i=0;i
您仍在进行O(N2)次迭代,但每次迭代所做的工作要少得多。需要注意的一点是
[t insertObject:[teams objectAtIndex:i] atIndex:0];
使t
中的所有元素在每次使用时都发生移位。这会大大降低速度,因为你在一个循环中做了两次。使用[t addObject:…]
可能更好
另外,NSMutableArray
可能会不必要地调整大小。如果您大致知道它需要多大,可以使用特定容量初始化它:
NSMutableArray *t = [[NSMutableArray alloc] initWithCapacity: size];
需要注意的一点是
[t insertObject:[teams objectAtIndex:i] atIndex:0];
使t
中的所有元素在每次使用时都发生移位。这会大大降低速度,因为你在一个循环中做了两次。使用[t addObject:…]
可能更好
另外,NSMutableArray
可能会不必要地调整大小。如果您大致知道它需要多大,可以使用特定容量初始化它:
NSMutableArray *t = [[NSMutableArray alloc] initWithCapacity: size];
谢谢你的快速回复。。。但是,我在这些行中遇到了多个错误:
masks[i]=[[teams[i]objectForKey:@“mask”]intValue]
和[匹配addObject:@[teams[i],teams[j]]代码>这些行使用Xcode 4.4和4.5中添加的新Objective-C订阅语法。您需要升级Xcode,或者将这些行更改为使用objectAtIndex:
而不是使用订阅。感谢您的快速响应。。。但是,我在这些行中遇到了多个错误:masks[i]=[[teams[i]objectForKey:@“mask”]intValue]
和[匹配addObject:@[teams[i],teams[j]]代码>这些行使用Xcode 4.4和4.5中添加的新Objective-C订阅语法。您需要升级Xcode,或者将这些行更改为使用objectAtIndex:
而不是使用订阅。