Swift 3:快速文件路径分离
问题描述:
我需要为数千个文件分割文件路径的一部分。所以我需要一个快速功能。我自己写的,但它似乎运行速度很慢:Swift 3:快速文件路径分离
// find string in "str", split at the position, delivers left and right side
func revFindSplit_(str : String, searchString : String) -> (String, String) {
let strr = String(str.characters.reversed()) // reverse main string
let searchStringr = String(searchString.characters.reversed()) // reverse search string too
if let strrindex = strr.range(of: searchStringr) { // now we can search from back to front
let rangeOfS2 = strr.characters.startIndex..<strrindex.lowerBound // we got search result: part 1 (front)
let rangeOfS1 = strrindex.lowerBound..<strr.characters.endIndex // part 2 (back)
let S2 = String(strr[rangeOfS2].characters.reversed()) // put together and reverse again
let S1 = String(strr[rangeOfS1].characters.reversed())
// here we have to remove search string
let S1M1 = String(S1.characters.prefix(S1.characters.count - searchString.characters.count))
return (S1M1, S2)
}
else {
return (str, "") // without splitting
}
}
// split path of filename into all 3 part: directory name, filename without extension, extension (without dot)
// in one call (faster than the 3 functions separatly)
func splitFilename_(str: String) -> (directory: String, filenameOnly: String, ext: String) {
let url = NSURL(fileURLWithPath: str)
let path = url.path!
// split path and filename
let (directory, filenameExt) = revFindSplit_(str: path, searchString: "/")
// split filename in filenameOnly and extension
let (filenameOnly, ext) = revFindSplit_(str: filenameExt, searchString: ".")
return (directory, filenameOnly, ext)
}
有没有什么办法可以大大提高速度? (可能使用库函数)
答
您可以减少整个代码:
func splitFilename(str: String) -> (directory: String, filenameOnly: String, ext: String) {
let url = URL(fileURLWithPath: str)
return (url.deletingLastPathComponent().path, url.deletingPathExtension().lastPathComponent, url.pathExtension)
}
+0
非常好。正是我所搜索的。因为我现在开始(使用Swift 3.0),所以我想做对。 :-) 非常感谢你。 –
答
按现代CPU标准划分数千个字符串并不是一项大任务。要让英特尔CPU陷入困境,您需要数百万美元。你确定这是你的应用程序的瓶颈吗?
“过早的优化是所有罪恶的根源” - 高德纳
最后,你的代码是史诗!你有没有尝试内置到NSString
的路径操作?
func splitFileName(str: String) -> (directory: String, fileName: String, extension: String) {
let path = str as NSString
let directory = path.deletingLastPathComponent
let fileNameWithExtension = path.lastPathComponent as NSString
let fileNameWithoutExtension = fileNameWithExtension.deletingPathExtension
let fileExtension = fileNameWithExtension.pathExtension
return (directory, fileNameWithoutExtension, fileExtension)
}
我怀疑你使用@vardian解决方案时有性能问题。但是如果真的不够快,你需要一个'戏剧性'的加速,从字符串'import Glibc'或'import Darwin'中获取UTF8,并使用C函数(比如'basename','strstr'等等。)。 – hnh