热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Swift似乎比循环中的Objective-C慢-SwiftseemstobeslowerasObjective-Cinloops

ImtryingtoportsomecodefromObjective-CtoSwift,withwhichIparseHTMLdocuments.Imusing

I'm trying to port some code from Objective-C to Swift, with which I parse HTML documents. I'm using basically the NSXMLDocument and created own classes for HTMLDocument and HTMLNode to bring some extra functionality like getElementByID and so on.

我正在尝试将一些代码从Objective-C移植到Swift,我用它来解析HTML文档。我基本上使用NSXMLDocument并为HTMLDocument和HTMLNode创建了自己的类,以带来一些额外的功能,如getElementByID等。

If I now compare the ported code, the parsing in Obj-C needs 0.098 seconds, the code in Swift needs 0.49 seconds! I partly commented out the code and I could see, that it correlates with some loops, in which I "translate" the NSXML part to my own class. For example:

如果我现在比较移植的代码,Obj-C中的解析需要0.098秒,Swift中的代码需要0.49秒!我部分注释了代码,我可以看到,它与一些循环相关,我将NSXML部分“翻译”到我自己的类中。例如:

func getElementsByTagName(tagName: String) -> HTMLNode[] {
    let xPath = ".//\(tagName)"
    let xmlNodes = xmlElement.nodesForXPath(xPath, error: nil)
    var htmlNodes = HTMLNode[]()
    if xmlNodes.count > 0 {
        for element in xmlNodes as NSXMLNode[] {
            var node = HTMLNode(xmlElement: element as NSXMLElement)
            htmlNodes.append(node)
        }
    }
    return htmlNodes
}

This is the original code: (don't wonder about the missing if ... > 0. Obj-C don't enter the for loop, if xmlNodes is nil. Swift brings a runtime error)

这是原始代码:(不要怀疑丢失if ...> 0.如果xmlNodes为nil,则Obj-C不进入for循环.Swift带来运行时错误)

- (NSArray*)getElementsByTagName:(NSString*)tagName {
    NSString *xPath = [NSString stringWithFormat:@".//%@", tagName];
    NSArray *xmlNodes = [self.xmlElement nodesForXPath:xPath error:nil];
    NSMutableArray *htmlNodes = [[NSMutableArray alloc] init];
    for (NSXMLElement *el in xmlNodes) {
        HTMLNode *node = [HTMLNode initWithXMLElement:el];
        [htmlNodes addObject:node];
    }
    return htmlNodes;
}

Is this a problem with swift or do I oversee some code error?

这是swift的问题还是我监督一些代码错误?

1 个解决方案

#1


9  

Remember, these two environments are bridged, which means that if your swift code calls into Objective-C objects, you're still going to pay the dynamic dispatch (i.e. objc_msgSend) penalty. In this loop, the things you're looping over are in an NSArray so all the looping calls (presumably NSFastEnumeration) still have to traverse the bridge every time.

请记住,这两个环境是桥接的,这意味着如果你的swift代码调用Objective-C对象,你仍然会支付动态调度(即objc_msgSend)惩罚。在这个循环中,你循环的东西都在NSArray中,所以所有循环调用(可能是NSFastEnumeration)仍然必须每次遍历桥。

The "real" speedup is going to come from sections of code that are pure swift and don't hit the Objective-C bridge. This is really the same discussion as the old "C++ is faster" argument. C++ is faster, but only if you're not constantly calling back into Objective-C.

“真正的”加速将来自纯粹迅速并且没有达到Objective-C桥的代码部分。这与旧的“C ++更快”的论点完全相同。 C ++更快,但只有当你不经常回调到Objective-C时。

In an ideal world, the best strategy here would be to use a native swift XML parser (which probably doesn't exist at this point) and have your model and controller objects all be pure swift with shim classes for where they cross the border into Objective-C. If we were talking about C++ instead of swift, I would say that if you rewrote your model and controller objects as native C++ objects and then used a pure C++ XML parser, and only used Objective-C at the point where you had to interact with the UI, you would expect significant performance gains.

在一个理想的世界中,这里最好的策略是使用原生的swift XML解析器(此时可能不存在),并让你的模型和控制器对象都是纯粹的快速类,它们跨越边界进入边界Objective-C的。如果我们讨论的是C ++而不是swift,我会说如果你将模型和控制器对象重写为本机C ++对象,然后使用纯C ++ XML解析器,并且只在必须与之交互时使用Objective-C用户界面,你会期望显着的性能提升。

When swift has to interact with Objective-C libraries, it can't make those libraries any faster than they were before, so naturally they can only be "as fast" or "slower." The real wins will come from pure swift code. It's likely that you could also get some gains by using swift to call directly into C (or C++) libraries but the generic (i.e. not-Apple-provided) P/Invoke story (to use a .NET word) is not very clear at the moment.

当swift必须与Objective-C库交互时,它不能使这些库比以前更快,所以很自然它们只能“快”或“慢”。真正的胜利将来自纯粹的快速代码。你可以通过使用swift直接调用C(或C ++)库来获得一些收益,但通用(即不是Apple提供的)P / Invoke故事(使用.NET字)并不十分清楚此时此刻。


推荐阅读
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • Python正则表达式学习记录及常用方法
    本文记录了学习Python正则表达式的过程,介绍了re模块的常用方法re.search,并解释了rawstring的作用。正则表达式是一种方便检查字符串匹配模式的工具,通过本文的学习可以掌握Python中使用正则表达式的基本方法。 ... [详细]
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 本文介绍了brain的意思、读音、翻译、用法、发音、词组、同反义词等内容,以及脑新东方在线英语词典的相关信息。还包括了brain的词汇搭配、形容词和名词的用法,以及与brain相关的短语和词组。此外,还介绍了与brain相关的医学术语和智囊团等相关内容。 ... [详细]
  • 本文讨论了在Windows 8上安装gvim中插件时出现的错误加载问题。作者将EasyMotion插件放在了正确的位置,但加载时却出现了错误。作者提供了下载链接和之前放置插件的位置,并列出了出现的错误信息。 ... [详细]
  • [译]技术公司十年经验的职场生涯回顾
    本文是一位在技术公司工作十年的职场人士对自己职业生涯的总结回顾。她的职业规划与众不同,令人深思又有趣。其中涉及到的内容有机器学习、创新创业以及引用了女性主义者在TED演讲中的部分讲义。文章表达了对职业生涯的愿望和希望,认为人类有能力不断改善自己。 ... [详细]
  • 安卓select模态框样式改变_微软Office风格的多端(Web、安卓、iOS)组件库——Fabric UI...
    介绍FabricUI是微软开源的一套Office风格的多端组件库,共有三套针对性的组件,分别适用于web、android以及iOS,Fab ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 从零学Java(10)之方法详解,喷打野你真的没我6!
    本文介绍了从零学Java系列中的第10篇文章,详解了Java中的方法。同时讨论了打野过程中喷打野的影响,以及金色打野刀对经济的增加和线上队友经济的影响。指出喷打野会导致线上经济的消减和影响队伍的团结。 ... [详细]
  • 利用Visual Basic开发SAP接口程序初探的方法与原理
    本文介绍了利用Visual Basic开发SAP接口程序的方法与原理,以及SAP R/3系统的特点和二次开发平台ABAP的使用。通过程序接口自动读取SAP R/3的数据表或视图,在外部进行处理和利用水晶报表等工具生成符合中国人习惯的报表样式。具体介绍了RFC调用的原理和模型,并强调本文主要不讨论SAP R/3函数的开发,而是针对使用SAP的公司的非ABAP开发人员提供了初步的接口程序开发指导。 ... [详细]
  • C++中的三角函数计算及其应用
    本文介绍了C++中的三角函数的计算方法和应用,包括计算余弦、正弦、正切值以及反三角函数求对应的弧度制角度的示例代码。代码中使用了C++的数学库和命名空间,通过赋值和输出语句实现了三角函数的计算和结果显示。通过学习本文,读者可以了解到C++中三角函数的基本用法和应用场景。 ... [详细]
  • Android开发实现的计时器功能示例
    本文分享了Android开发实现的计时器功能示例,包括效果图、布局和按钮的使用。通过使用Chronometer控件,可以实现计时器功能。该示例适用于Android平台,供开发者参考。 ... [详细]
  • 本文讨论了在openwrt-17.01版本中,mt7628设备上初始化启动时eth0的mac地址总是随机生成的问题。每次随机生成的eth0的mac地址都会写到/sys/class/net/eth0/address目录下,而openwrt-17.01原版的SDK会根据随机生成的eth0的mac地址再生成eth0.1、eth0.2等,生成后的mac地址会保存在/etc/config/network下。 ... [详细]
author-avatar
mobiledu2502915233
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有