Jiaolong's Blog Jiaolong's Blog
首页
分类
归档
Wiki
摘录
导航
留言
关于

Jiaolong

Solo Developer
首页
分类
归档
Wiki
摘录
导航
留言
关于
  • 在 Ubuntu 20.04 上安装 GCC
  • hello world
  • 使用cva6+spike搭建RISC-V环境
  • gcc编译过程查看汇编代码
  • 分析RISC-V汇编代码
  • RISC-V V扩展1.0版本环境搭建与测试
  • RISCV-V扩展执行速度测试
  • 移植FFmpeg到RISC-V记录
  • Linux创建Swap交换分区
  • RISC-V \\V\\ Vector Extension 1.0 翻译
  • RISCV-V拓展1.0解读
  • 浅谈向量化和SIMD
  • x264编译测试
  • 浅淡Makefile
  • 回炉重造C语言
  • 使用Gprof+Gprod2dot做性能分析
  • 移植x264到RISC-V
  • QEMU运行RVV
  • 优化x264
  • 音视频理论基础
  • Swift拼音排序
  • Blog
Jiaolong
2022-12-08

Swift拼音排序

在最近的开发工作中,我需要完成一个排序的功能:把数据按名称排序,思路也很简单,首先把名称转换为拼音,再把拼音按照常规的字母排序即可,于是我找到了如下代码。

let startTime = CFAbsoluteTimeGetCurrent()
var number:Int = 0
results =  results.sorted { (value1, value2) -> Bool in
	let pinyin1 = value1.name!.transformToPinYin().lowercased()
	let pinyin2 = value2.name!.transformToPinYin().lowercased()
	number += 1
	return pinyin1.compare(pinyin2) == .orderedAscending
}
let endTime = CFAbsoluteTimeGetCurrent()
debugPrint("代码处理\(number)条执行时长:\((endTime - startTime)*1000) 毫秒")

//"代码处理734条执行时长:2005.2640438079834 毫秒"
1
2
3
4
5
6
7
8
9
10
11
12
1
2
3
4
5
6
7
8
9
10
11
12

发现异常耗时,因为转换拼音本来就是一个较慢的工作。

再经过测试后发现sorted中的转换换会执行不止1次,具体排序算法等有空需要进一步分析源码。

实际上在sorted的过程中,转换为拼音其实只需要一次,并不用每次都做重复的转换,所以立即想到了排序前用字典把需要排序的name的拼音存下来,在排序中只需要拿到对应的值就可以了。

let startTime = CFAbsoluteTimeGetCurrent()
var number:Int = 0
var pinyinDict:[UUID:String] = [:]//第二种
for item in results{
    pinyinDict[item.id!] = item.name!.transformToPinYin().lowercased()
    number += 1
}

let endTime = CFAbsoluteTimeGetCurrent()

debugPrint("拼音处理\(number)条执行时长:\((endTime - startTime)*1000) 毫秒")

results =  results.sorted { (value1, value2) -> Bool in
    return pinyinDict[value1.id!]!.compare(pinyinDict[value2.id!]!) == .orderedAscending
}

debugPrint("比较时间:\((CFAbsoluteTimeGetCurrent() - endTime)*1000) 毫秒")

//"拼音处理70条执行时长:88.63401412963867 毫秒"
//"比较时间:1.7720460891723633 毫秒"
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

速度明显大幅度提升。

http://www.rcyd.net/mobnews/16382.html (opens new window)

提到了可以用缓存的方式进行存储,等有可以再优化下。目前每条数据1毫秒的耗时还可以接受。

下另一种优化方案:给数据库中加入拼音字段,这样在排序时可以减少大量工作。

Last updated: 2022/12/08, 06:27:06

← 音视频理论基础

Copyright © 2022-2023 | Jiaolong Wang
  • 跟随系统
  • 浅色模式
  • 深色模式