gpt4 book ai didi

ios - 在 NSNumbers 的 NSArray 中查找最小值和最大值

转载 作者:IT老高 更新时间:2023-10-28 11:36:40 29 4
gpt4 key购买 nike

比较 floats 中包含 NSNumbersNSArray 的所有值以找到最大的值和最小的值的有效且好方法是什么一个?

有什么想法可以在 Objective-C 中快速完成这项工作吗?

最佳答案

如果执行速度(而不是编程速度)很重要,那么显式循环是最快的。我用一个包含 1000000 个随机数的数组进行了以下测试:

版本1:对数组进行排序:

NSArray *sorted1 = [numbers sortedArrayUsingSelector:@selector(compare:)];
// 1.585 seconds

版本2:键值编码,使用“doubleValue”:

NSNumber *max=[numbers valueForKeyPath:@"@max.doubleValue"];
NSNumber *min=[numbers valueForKeyPath:@"@min.doubleValue"];
// 0.778 seconds

版本 3:键值编码,使用“self”:

NSNumber *max=[numbers valueForKeyPath:@"@max.self"];
NSNumber *min=[numbers valueForKeyPath:@"@min.self"];
// 0.390 seconds

版本 4:显式循环:

float xmax = -MAXFLOAT;
float xmin = MAXFLOAT;
for (NSNumber *num in numbers) {
float x = num.floatValue;
if (x < xmin) xmin = x;
if (x > xmax) xmax = x;
}
// 0.019 seconds

版本 5: block 枚举:

__block float xmax = -MAXFLOAT;
__block float xmin = MAXFLOAT;
[numbers enumerateObjectsUsingBlock:^(NSNumber *num, NSUInteger idx, BOOL *stop) {
float x = num.floatValue;
if (x < xmin) xmin = x;
if (x > xmax) xmax = x;
}];
// 0.024 seconds

测试程序创建一个包含 1000000 个随机数的数组,然后应用所有排序技术到同一阵列。上面的时间是一次运行的输出,但我做了大约 20 次运行,每次运行的结果非常相似。我还更改了 5 种排序方法的应用顺序以排除缓存效果。

更新:我现在创建了一个(希望)更好的测试程序。完整的源代码在这里:https://gist.github.com/anonymous/5356982 .排序的平均时间1000000 个随机数的数组是(以秒为单位,在 3.1 GHz Core i5 iMac 上,发布编译):

Sorting      1.404KVO1         1.087KVO2         0.367Fast enum    0.017Block enum   0.021

Update 2: As one can see, fast enumeration is faster than block enumeration (which is also stated here: http://blog.bignerdranch.com/2337-incremental-arrayification/).

EDIT: The following is completely wrong, because I forgot to initialize the object used as lock, as Hot Licks correctly noticed, so that no synchronization is done at all.And with lock = [[NSObject alloc] init]; the concurrent enumeration is so slowthat I dare not to show the result. Perhaps a faster synchronization mechanism mighthelp ...)

This changes dramatically if you add the NSEnumerationConcurrent option to theblock enumeration:

__block float xmax = -MAXFLOAT;
__block float xmin = MAXFLOAT;
id lock;
[numbers enumerateObjectsWithOptions:NSEnumerationConcurrent usingBlock:^(NSNumber *num, NSUInteger idx, BOOL *stop) {
float x = num.floatValue;
@synchronized(lock) {
if (x < xmin) xmin = x;
if (x > xmax) xmax = x;
}
}];

这里的时间是

Concurrent enum  0.009

所以它的速度大约是快速枚举的两倍。结果可能不具有代表性因为它取决于可用的线程数。但还是很有趣!请注意,我使用了“最容易使用”的同步方法,这可能不是最快的。

关于ios - 在 NSNumbers 的 NSArray 中查找最小值和最大值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15931112/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com