在Swift 4中将Character转换为大写或小写的最快方法?

时间:2017-10-17 11:56:47

标签: swift unicode swift4

我理解1- Linda 2- Micheal, 19, George, CA 3- NY, male 类不支持CharactertoUpper()的原因,但我的用例不是用于语言目的。此外,我不想回复toLower()

那么使用Swift 4将字符转换为大写或小写的最快方法是什么?

NSString

1 个答案:

答案 0 :(得分:3)

如果您只需要大写第一个字符,请使用下面的Barcode。它比整个字符串的上限快5倍。

uppercase2()

在1000万次运行中,Apple的import Foundation // too slow, maybe with some bitwise operations could get faster ‍♀️ func uppercase(_ string: String) -> Character? { let key: Int8 = string.utf8CString[0] guard key>0, key<127, let c = Unicode.Scalar(Int(key >= 97 ? key - Int8(32) : key)) else { return nil } return Character(c) } // winner but using internal _core stuff func uppercase2(_ string: String) -> Character? { guard let key = string._core.asciiBuffer?[0] else { return nil } return Character(Unicode.Scalar(key >= 97 ? key - 32 : key)) // use < + to lowercase } func measure(times: Int, task: ()->()){ let start1 = CFAbsoluteTimeGetCurrent() for _ in 1..<times { task() } print(CFAbsoluteTimeGetCurrent() - start1) } print("".uppercased().first as Any) // Optional("") print(uppercase("") as Any) // nil print(uppercase2("") as Any) // nil measure(times: 10_000_000) { _ = "ABCDEFGHIJKLMNOPQRSTUVWXYZ".uppercased().first } // 4.17883902788162 measure(times: 10_000_000) { _ = uppercase("ABCDEFGHIJKLMNOPQRSTUVWXYZ") } // 4.91275697946548 measure(times: 10_000_000) { _ = uppercase2("ABCDEFGHIJKLMNOPQRSTUVWXYZ") } // 0.720575034618378 运行速度比本帖底部的代码快148倍,即使使用强制解包也是如此。我会把它留给喜剧目的。

他们的做法当然是低级别的。见lowercased()。他们检查内部asciiBuffer,然后使用_asciiUpperCaseTable

我的理解是,如果原始String已经是Swift字符串,它将由StringCore类表示,该类已经过优化,可以处理低级别的ASCII字符。因此,你将无法击败Swift的大写功能。

所以,答案是:最快的方法是使用常规的uppercased函数。

我假设“我的用例不是用于语言目的”意味着我只使用ASCII。这提供的优点是UTF-8和ASCII共享相同的标量代码,因此大写/小写意味着减去或添加固定数字。

uppercase()