- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在尝试将一些代码从 Objective-C 移植到 Swift,我用它来解析 HTML 文档。我基本上使用 NSXMLDocument 并为 HTMLDocument 和 HTMLNode 创建了自己的类,以带来一些额外的功能,如 getElementByID 等。
如果我现在比较移植的代码,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
}
这是原始代码:(不要怀疑缺少 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;
}
这是 swift 的问题还是我监督了一些代码错误?
最佳答案
请记住,这两个环境是桥接的,这意味着如果您的 swift 代码调用 Objective-C 对象,您仍然要支付动态调度(即 objc_msgSend
)惩罚。在这个循环中,你要循环的东西在 NSArray
中,所以所有循环调用(大概是 NSFastEnumeration
)仍然必须每次都遍历桥。
“真正的”加速将来自纯 swift 的代码部分,并且不会碰到 Objective-C 桥。这与旧的“C++ 更快”论点实际上是相同的讨论。 C++ 更快,但前提是您不经常回调 Objective-C。
在理想情况下,这里最好的策略是使用原生的 swift XML 解析器(此时可能不存在),让你的模型和 Controller 对象都是纯 swift 的,并在它们交叉的地方使用垫片类到 Objective-C 的边界。如果我们谈论的是 C++ 而不是 swift,我会说,如果您将模型和 Controller 对象重写为原生 C++ 对象,然后使用纯 C++ XML 解析器,并且只在必须与之交互的地方使用 Objective-C用户界面,您会期望显着的性能提升。
当 swift 必须与 Objective-C 库交互时,它无法使这些库比以前更快,因此它们自然只能“一样快”或“更慢”。真正的胜利将来自纯粹的 swift 代码。很可能您也可以通过使用 swift 直接调用 C(或 C++)库来获得一些 yield ,但是通用的(即非 Apple 提供的)P/Invoke 故事(使用 .NET 词)在此刻。
关于Swift 似乎比循环中的 Objective-C 慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24030993/
自己试试看: import pandas as pd s=pd.Series(xrange(5000000)) %timeit s.loc[[0]] # You need pandas 0.15.1
我最近开始使用 Delphi 中的 DataSnap 来生成 RESTful Web 服务。在遵循 Marco Cantu 本人和互联网上其他几个人的指导后,我成功地使整个“链条”正常工作。 但是有一
我一直在为操作系统类(class)编写以下代码,但结果有些奇怪。该代码创建x线程并同时运行它们,以便将两个平方矩阵相乘。每个线程将输入矩阵的Number_of_rows/Number_of_threa
我正在尝试确定何时使用 parallel包以加快运行某些分析所需的时间。我需要做的一件事是创建矩阵,比较具有不同行数的两个数据框中的变量。我在 StackOverflow 上问了一个关于有效方法的问题
我最近对我的代码进行了一些清理,并在此过程中更改了此内容(不完全是真实的代码): read = act readSTRef test1 term i var = do t v^!terms.
我正在计时查询和同一个查询的执行时间,分页。 foreach (var x in productSource.OrderBy(p => p.AdminDisplayName) .Wher
我正在开发一个项目 (WPF),我有一个 Datagrid 从数据库加载超过 5000 条记录,所以我使用 BackgroundWorker 来通知用户数据正在加载,但它太慢了,我需要等待将近 2分钟
我在查询中添加 ORDER BY 时遇到问题。没有 ORDER BY 查询大约需要 26ms,一旦我添加 ORDER BY,它大约需要 20s。 我尝试了几种不同的方法,但似乎可以减少时间。 尝试 F
我是 Android 开发新手,遇到了性能问题。当我的 GridView 有太多项目时,它会变得有点慢。有什么方法可以让它运行得更快一些吗? 这是我使用的代码: 适配器: public class C
这里的要点是: 1.设置query_cache_type = 0;重置查询缓存; 2.在 heidisql(或任何其他客户端 UI)中运行任何查询 --> 执行,例如 45 毫秒 3.使用以下代码运行
想象下表: CREATE TABLE drops( id BIGSERIAL PRIMARY KEY, loc VARCHAR(5) NOT NULL, tag INT NOT
我的表 test_table 中的示例数据: date symbol value created_time 2010-01-09 symbol1
首先,如果已经有人问过这个问题,我深表歉意,至少我找不到任何东西。 无论如何,我将每 5 分钟运行一次 cron 任务。该脚本加载 79 个外部页面,而每个页面包含大约 200 个我需要在数据库中检查
我有下面的 SQL 代码,它来自 MySQL 数据库。现在它给了我期望的结果,但是查询很慢,我想我应该在进一步之前加快这个查询的速度。 表agentstatusinformation有: PKEY(主
我需要获取一个对象在 Core Data 中数千个其他对象之间的排名。现在,这是我的代码: - (void)rankMethod { //Fetch all objects NSFet
我正在编写一个应用程序,我需要在其中读取用户的地址簿并显示他所有联系人的列表。我正在测试的 iPhone 有大约 100 个联系人,加载联系人确实需要很多时间。 ABAddressBookRef ad
我正在使用 javascript 将 160 行添加到包含 10 列的表格中。如果我这样做: var cellText = document.createTextNode(value); cell.a
我是 Swift 的新手,我已经设置了一个 tableView,它从 JSON 提要中提取数据并将其加载到表中。 表格加载正常,但是当表格中有超过 10 个单元格时,它会变得缓慢且有些滞后,特别是它到
我在 InitializeCulture 和 Page_PreInit 事件之间的 asp.net 页面中遇到性能问题。当我重写 DeterminePostBackMode() 时,我发现问题出在 b
我在 Hetzner 上有一个带有 256GB RAM 6 个 CPU(12 个线程) 的专用服务器,它位于德国。我有 CENTOS 7.5。 EA4。 我的问题是 SSL。每天大约 2 小时,我们在
我是一名优秀的程序员,十分优秀!