indexOfObjectsPassingTest 或filteredArrayUsingPredicate 哪个性能更快?

2024-01-07

当需要过滤 NSArray 以获取返回数组中的项目子集时,哪种方法更快更频繁且在边缘情况下?


以下测试(Release模式下编译,在Mac Pro上执行)indicate that filteredArrayUsingPredicate慢于indexesOfObjectsPassingTest如果你使用 “文本”谓词,但如果使用基于块的谓词,速度会更快。 我的测试中的禁食方法是一个简单的(快速枚举)循环,它添加所有匹配的 对象到可变数组。

过滤 10,000,000 个字典的数组的结果,其中大约 50% 与谓词匹配:



8.514334 (predicateWithFormat)
4.422550 (predicateWithBlock)
5.170086 (indexesOfObjectsPassingTest)
3.154015 (fast-enumeration + mutable array)
  

当然,对于其他谓词,结果可能会有所不同。

#import <Foundation/Foundation.h>

NSUInteger filter1(NSArray *a)
{
    NSPredicate *pred = [NSPredicate predicateWithFormat:@"num > 1000 AND foo == 'bar'"];
    NSArray *filtered = [a filteredArrayUsingPredicate:pred];
    return [filtered count];
}

NSUInteger filter2(NSArray *a)
{
    NSPredicate *pred = [NSPredicate predicateWithBlock:^BOOL(NSDictionary *obj, NSDictionary *bindings) {
        return ([obj[@"num"] intValue] > 1000 && [obj[@"foo"] isEqualToString:@"bar"]);
    }];
    NSArray *filtered = [a filteredArrayUsingPredicate:pred];
    return [filtered count];
}

NSUInteger filter3(NSArray *a)
{
    NSIndexSet *matching = [a indexesOfObjectsPassingTest:^BOOL(NSDictionary *obj, NSUInteger idx, BOOL *stop) {
        return ([obj[@"num"] intValue] > 1000 && [obj[@"foo"] isEqualToString:@"bar"]);
    }];
    NSArray *filtered = [a objectsAtIndexes:matching];
    return [filtered count];
}

NSUInteger filter4(NSArray *a)
{
    NSMutableArray *filtered = [NSMutableArray array];
    for (NSDictionary *obj in a) {
        if ([obj[@"num"] intValue] > 1000 && [obj[@"foo"] isEqualToString:@"bar"]) {
            [filtered addObject:obj];
        }
    }
    return [filtered count];
}

void testmethod(NSArray *a, NSUInteger(*method)(NSArray *a))
{
    @autoreleasepool {
        NSDate *t1 = [NSDate date];
        NSUInteger count = method(a);
        NSDate *t2 = [NSDate date];
        NSLog(@"%f", [t2 timeIntervalSinceDate:t1]);
    }
}

int main(int argc, const char * argv[])
{
    @autoreleasepool {
        NSMutableArray *a = [NSMutableArray array];
        for (int i = 0; i < 10000000; i++) {
            [a addObject:@{@"num": @(arc4random_uniform(2000)), @"foo":@"bar"}];
        }
        testmethod(a, filter1);
        testmethod(a, filter2);
        testmethod(a, filter3);
        testmethod(a, filter4);
    }
    return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

indexOfObjectsPassingTest 或filteredArrayUsingPredicate 哪个性能更快? 的相关文章

随机推荐

  • Promise.all 和 Promise.race 是否有记录的行为有效地使所有承诺“得到处理”?

    下面 代码unhandledRejection没有被解雇p2 即使它也被拒绝 尽管晚于p1 process on unhandledRejection reason promise gt console log unhandledRejec
  • 无法从 OpenShift origin pod 解析 github.com

    我有一个基本的 OpenShift 起源集群oc cluster up 现在 在默认的 MyProject 中 我想从 git repo 构建源 但失败并出现错误Could not resolve host github com Name
  • 核心数据迁移技术:移动属性 -> 建模关系

    我有一个相当大的基于核心数据的数据库模式 约 20 个实体 超过 140 个属性 当它从 1 x 代码库迁移到 2 x 代码库时 它正在经历巨大的变化 我非常熟悉执行轻量级迁移 但我对这种特定的迁移有点困惑 因为有一些实体用于将相关对象存储
  • 用于计算子组中的排名和中位数的 SQL 排名查询

    我想计算Median http en wikipedia org wiki Median of y in 子组这个简单的xy table x y groups gt gid x y medians gt gid x y 0 1 4 0 0
  • PHP 只读属性?

    在使用 PHP 的 DOM 类 DOMNode DOMEElement 等 时 我注意到它们拥有真正的只读属性 例如 我可以读取 DOMNode 的 nodeName 属性 但无法写入它 如果我这样做 PHP 会引发致命错误 如何在 PHP
  • 如何用vite做多个捆绑?

    使用vite js捆绑我的库 我需要同时提供两个版本 生产用途 通过 devtools 集成开发特定代码和警告 当我使用 webpack 时 我有 module exports defaultUmdBuild production defa
  • 在AJAX上初始化Google地图刷新部分

    我可以毫无问题地显示带有标记的谷歌地图 但是当使用ajax刷新该部分时 我无法在该部分中显示地图 我猜这是因为使用 ajax 时不会触发最后的最终初始化行 function initialize var myLatlng new googl
  • Dynamics 365 Web API 电子邮件发送

    我正在为网站上的页面建立订阅 因此 潜在订阅者通过表单发布并添加到 Dynamics 365 Online 中的营销列表 然后 我根据网站上的预定工作向营销列表中的联系人提出请求 然后我需要向他们发送一封电子邮件 说明已使用此属性创建了一个
  • NetworkX:在 DAG 中查找最长路径,返回最大的所有关系

    我无法弄清楚如何更新 networkx dag find longest path 算法以返回 N 表示关系 而不是返回找到的第一个最大边 或返回与最大权重相关的所有边的列表 我首先从 pandas 数据帧创建了一个 DAG 其中包含如下子
  • Python 是 vs == [重复]

    这个问题在这里已经有答案了 可能的重复 Python 中的字符串比较 is 与 https stackoverflow com questions 2988017 string comparison in python is vs 什么时候
  • 使用 Remember_me 时注销后 Flask-Login 仍然登录

    要使用 Flask login 在 Flask 中注销用户 我只需调用 logout user 但是在添加一些额外的会话检查后 在我单击注销并再次单击返回 登录页面 后 我仍然登录 它发生了只有当我选择 记住我 时 我想我在这里误解了 se
  • 本地和远程重命名 Git 分支? [复制]

    这个问题在这里已经有答案了 有没有办法在本地重命名 Git 分支并将其推送到远程分支 即使已经有很多提交推送到远程分支 或者 是否需要创建一个新的本地分支 删除旧的本地分支 然后在远程仓库上重复操作 Yes 特点move存在以在本地重命名分
  • 创建树结构

    我正在开发一个 asp net 项目 在我的 aspx 页面中 我有一个 gridview 它有 3 列 元素 目标 父级 在客户端 我想使用 gridview 中的数据构建一个树结构 然后用数字构建一个树 我找到了有关如何构建图形的信息和
  • YouTube onPlayerReady 永远不会被触发

    知道为什么这个脚本不起作用吗 我想要的只是追踪onStateChanged事件 但也从未被调用过 当我使用下面的代码打开 html 文档时 我没有错误 youtube 脚本加载得很好 播放器对象不是undefined 看起来也不错 docu
  • 基于函数的索引没有提高查询性能

    我已经创建了视图 并在该视图中添加了我需要的以下 case 语句 并且我已经为其创建了基于函数的索引 该视图有1900000条记录 当我尝试执行该视图时 需要几个小时才能运行 并且该视图的性能非常低 我不明白如何提高性能 CREATE OR
  • Java 中最大字符串不匹配数

    我最近在 codehub 上遇到了一个问题 但无法解决这个查询 谁能帮我解决这个问题吗 给定一个长度为 N 的字符串 S 您可以选择并反转 S 中任意长度的任何子字符串 您可以多次执行此操作 通过执行操作确定最大不匹配数 不匹配 S 被定义
  • 阻止 & 符号变成 Windows 窗体绑定的助记符/加速器 [重复]

    这个问题在这里已经有答案了 可能的重复 在标签控件绑定到用户填充的属性的屏幕上 我在标签上看到带下划线的字符 助记符 因为基础数据包含 符号 例如 如果绑定属性包含 A B Trucking 则标签显示为 AB Trucking 且 B 带
  • 如何从 Azure AD 获取帐户?

    我有一个很好的 Azure Active Directory 设置有十几个用户 都是我 所以我有一个租户 ID 客户端 ID 和客户端密钥 我还在开发一个简单的控制台应用程序 它将充当该目录的公共客户端 该客户端还保存用户名和密码列表 因为
  • 在从类构造函数调用的方法中初始化最终变量[重复]

    这个问题在这里已经有答案了 今天我遇到了一种奇怪的行为 我不明白为什么 想象一下 我们在 Java 的一个典型类中有一个 Final 变量 我们可以立即初始化它或在类构造函数中初始化它 如下所示 public class MyClass p
  • indexOfObjectsPassingTest 或filteredArrayUsingPredicate 哪个性能更快?

    当需要过滤 NSArray 以获取返回数组中的项目子集时 哪种方法更快更频繁且在边缘情况下 以下测试 Release模式下编译 在Mac Pro上执行 indicate that filteredArrayUsingPredicate慢于i