Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/tfs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective-C与JavaScript循环性能_Javascript_Objective C_Performance_Loops_Combinations - Fatal编程技术网

Objective-C与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

我有一个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
                    });
                }
            }
}

一般来说,当你遇到性能问题时,你应该使用时间分析器工具来评测你的应用程序

在这种情况下,我可以看到一些可能的问题

首先,您在内部循环中执行以下操作:

[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:
而不是使用订阅。