【问题标题】:Swift 3: Fast file path separationSwift 3:快速文件路径分离
【发布时间】:2016-09-24 09:13:19
【问题描述】:

我需要为数千个文件拆分部分文件路径。所以我需要一个快速的功能。这是我自己写的,但运行起来似乎很慢:

// 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 )
}

有什么方法可以显着加快速度吗? (可能使用库函数)

【问题讨论】:

  • 我怀疑您在使用@vardian 的解决方案时遇到了性能问题。但如果这真的不够快,并且您需要“戏剧性”的加速,请从字符串中获取 UTF8,import Glibcimport Darwin 并在其上使用 C 函数(如 basenamestrstr 等)。 )。

标签: swift url split directory filenames


【解决方案1】:

您可以减少整个代码:

func splitFilename(str: String) -> (directory: String, filenameOnly: String, ext: String) {
  let url = URL(fileURLWithPath: str)
  return (url.deletingLastPathComponent().path, url.deletingPathExtension().lastPathComponent, url.pathExtension)
}

【讨论】:

  • 那太好了。正是我搜索的内容。因为我现在开始(使用 Swift 3.0),所以我想把它做好。 :-) 非常感谢。
【解决方案2】:

按照现代 CPU 标准,拆分数千个字符串并不是一项艰巨的任务。要让英特尔 CPU 陷入困境,您需要数百万美元。您确定这是您的应用程序的瓶颈吗?

“未成熟的优化是万恶之源”——Donald Knuth

最后,您的代码非常棒!您是否尝试过 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)
}

【讨论】:

  • NSString 的内置路径操作在 Swift 中已过时。 URL 更可取。
  • NSString 上的方法仍然存在,NSString 不会很快消失
  • 是的,但是 Swift(3) 中最先进的类(实际上是结构)是 StringURL。 Apple 放弃 Swift String 中的路径操作方法是出于性能原因,以鼓励开发人员使用与 URL 相关的 API。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-03
  • 1970-01-01
  • 2012-02-04
  • 1970-01-01
  • 2020-09-04
  • 2019-08-18
相关资源
最近更新 更多