Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何快速减少++操作符替换后的while-循环的执行时间?

如何快速减少++操作符替换后的while-循环的执行时间?
EN

Stack Overflow用户
提问于 2016-03-23 13:34:26
回答 4查看 212关注 0票数 1

新的Xcode (7.3)警告说,增量操作符++将在下一个swift3中删除。我使用了++的with循环(见下文)。在删除了增量操作符++之后,这个循环比使用++慢三倍。有什么更好的方法来改变这个时间循环呢?

在此之前

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 var first = string1.startIndex
 var last = first.advancedBy(n, limit: string1.endIndex)
 var myarray = [String]()

 while last != string1.endIndex
 {
     myarray.append(string1[first++...last++])
 } 

之后

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 var first = string1.startIndex
 var last = first.advancedBy(n, limit: string1.endIndex)
 var myarray = [String]()

 while last != string1.endIndex
 {
    myarray.append(string1[first...last])

    first = first.advancedBy(1) // or first = first.successor()
    last = first.advancedBy(n, limit: string1.endIndex) // or  last = last.successor()

 }
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2016-03-23 14:38:29

使用预分配和随机访问分配,而不是重复将元素附加到数组中。

添加行first = ...last = ...不应该像向未预先分配的数组重复添加元素(从而重复扩展数组)那样影响性能。如果初始化数组myarray并使用随机访问(myarray[i])来分配滑动窗口字符串值,而不是使用.append(...),您应该能够减少开销。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var first = string1.startIndex
var last = first.advancedBy(n, limit: string1.endIndex)
var myarray = [String](count: string1.characters.count-n,
                       repeatedValue: "")

for i in 0..<myarray.count {
    myarray[i] = string1[first...last]

    first = first.advancedBy(1)
    last = first.advancedBy(n, limit: string1.endIndex)
}

基准测试

我使用了下面的示例string1n来对上面修改的解决方案与您自己的解决方案进行基准测试:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var string1 = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce pretium diam at arcu suscipit, sed molestie mi rhoncus. Donec neque sapien, luctus ultricies ex sed, tristique auctor sem. Praesent varius ullamcorper nisi a commodo. Mauris eu rutrum enim, sit amet hendrerit velit. Curabitur iaculis neque ut tellus pretium, at convallis odio posuere. Integer ultricies diam ex, sit amet faucibus odio ultrices eu. Morbi tincidunt felis tellus, eget gravida est suscipit quis. Nam nunc ipsum, molestie sit amet neque at, aliquam maximus lacus. Sed bibendum massa a lorem eleifend, non eleifend felis commodo. Vivamus eget sem luctus, aliquam dolor nec, finibus diam. Morbi id justo vehicula, eleifend arcu nec, hendrerit neque. Donec ex ante, fringilla id rhoncus nec, porta id tortor. Donec dapibus nisl nibh, non posuere lacus egestas non. Duis massa quam, elementum sit amet volutpat eget, tincidunt sodales urna. Donec at congue ligula, a sollicitudin tortor."
string1 = string1+string1+string1 // 2880 characters
let n = 4

基准测试结果(使用-based function测量)

  • for i in ...循环预初始化数组解决方案:2.5s
  • .append(..)解决方案与while循环,如您的问题所示:32.5s

如果执行时间很重要,显然您将受益于预先初始化数组和使用随机访问分配,而不是重复使用.append(..)

最后,您可以问自己是否真的需要显式地存储滑动窗口中的所有子字符串,或者是否足以存储与它们对应的范围。如果n很大,上面的myarray将包含大量的重复字符/重叠子串。在这种情况下,您最好只保存一个Range<String.CharacterView.Index>元素数组,这些元素可以随时用于动态提取string1的相关子字符串。例如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var first = string1.startIndex
var last = first.advancedBy(n, limit: string1.endIndex)
var rangeArr = [Range<String.CharacterView.Index>](
        count: string1.characters.count-n,
        repeatedValue: first...last)

for i in 0..<rangeArr.count {
    rangeArr[i] = first...last

    first = first.advancedBy(1)
    last = first.advancedBy(n, limit: string1.endIndex)
}
票数 3
EN

Stack Overflow用户

发布于 2016-03-23 13:40:22

将增量从first++更改为first += 1 --这是关于不推荐版本的原则

但是,如果进行深入搜索,您可以发现increment over String.CharacterView.Index是实现自定义的后缀操作符,其中接受_Incrementable协议的泛型,该协议声明了用于返回下一个链值的successor方法。为什么++比直接successor更快?谁知道,显然有些优化正在开发中,而在中,Swift 3会有更好的速度。

票数 2
EN

Stack Overflow用户

发布于 2016-03-23 13:46:05

为什么不使用for循环而不是时间,然后直接使用索引进行访问。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var myarray = [String]()
for var i in string1.startIndex ... string1.endIndex {
    myarray.append(string1[i])
}

希望这能有所帮助。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36189116

复制
相关文章
在Excel中获得汉字的首字母
Function hztopy(hzpy As String) As String
钱塘小甲子
2019/06/22
1.4K0
【Excel】用公式提取Excel单元格中的汉字
昨天一个前端的朋友找我帮忙用excel提取代码中的汉字(字符串),可算费了劲儿了,他要提取的内容均在单引号中,但问题是没有统一的规律,同一个单元格可能存在多个要提取的内容,而且汉字中间也夹杂其他字符。
数据科学社区
2018/06/11
8.5K0
oracle 汉字显示问号
3. 修改变量 现在需要将AMERICAN_AMERICA.ZHS16GBK 改为 SIMPLIFIED CHINESE_CHINA.ZH16GBK oracle用户编辑家目录的 .bash_profile 添加
范一刀
2021/08/10
2.1K0
Excel图表技巧16:在图表中突出显示最大值
要突出显示Excel图表中的值,只需添加一个带有要突出显示的值的额外系列。假设想要突出显示销量最大的产品,添加一个额外的列来计算值,如下图3所示。
fanjy
2021/09/22
3.6K0
excel 汉字转拼音「建议收藏」
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/151859.html原文链接:https://javaforall.cn
全栈程序员站长
2022/06/24
7.8K0
芒果tv在miniblink无法显示的bug分析
http://www.mgtv.com/pcclient/tv/里用了window.external,
龙泉寺扫地僧
2019/02/20
9150
如何在AI Studio数据可视化图像中显示汉字
AI Studio是一个非常好用的数据科学在线实验平台,不论是教学、学习还是开发,都可以使用。但是,下面的缺憾未免成为了珍珠上的一点瑕疵。
老齐
2020/05/15
3.4K0
如何在AI Studio数据可视化图像中显示汉字
在DataGrid中显示图片
    DadaGrid 是 ASP.NET 编程中一个很重要的控件,其优良的可定制功能为提高它的表现力提供了极大的方便。除了与数据源直接绑定以外,我们还可以通过列绑定模板对 DataGrid 的列进行自定义,来按照我们设定的格式显示数据。
Java架构师必看
2021/03/22
3.4K0
c#:winform读取excel,并显示在griddataview
立羽
2023/08/24
1.4K0
c#:winform读取excel,并显示在griddataview
如何实现在Excel表格中删除汉字而不破坏其他内容?
方法一: 先将数据复制到WORD中, 在WORD中,编辑/替换 “查找内容”输入:[一-龤]      (带中括号) “替换为”输入:/ 勾选“使用通配符” 点“全部替换” 然后再将数据复制回EXCEL。 附: 龤:ALT+64922 WORD中是:ALT+40868 方法二: =REPLACE(A1,MATCH(” “,MIDB(A1,ROW($1:$100),1),),LENB(A1)-LEN(A1),”/”) 方法三: 若你汉字均在前面,在b1输入公式:=right(a1,l
用户1272546
2018/06/04
2.7K0
关于在eclipse中中文汉字乱码的解决方式[通俗易懂]
很多童鞋反应在吧项目导入到eclipse(myeclipse)时中文会有乱码,修改了编码格式后还是乱码,这里给大家介绍一下关于中文乱码时修改编码的注意事项:
全栈程序员站长
2022/09/01
5.2K0
关于在eclipse中中文汉字乱码的解决方式[通俗易懂]
如何实现在Excel表格中删除汉字而不破坏其他内容?
方法一: 先将数据复制到WORD中, 在WORD中,编辑/替换 “查找内容”输入:[一-龤]      (带中括号) “替换为”输入:/ 勾选“使用通配符” 点“全部替换”
用户1191760
2019/02/27
3.7K0
在Excel中创建悬浮图
步骤1:根据原始数据,整理用于创建图表的数据,如下图2所示。一个名为“隐藏”的列,计算出悬浮的高度,也就是前面显示的柱状的高度之后;一个名为“显示”的列,即绘制的可见柱状的高度。
fanjy
2023/10/05
6480
在Excel中创建悬浮图
使用WebSocket在Server类中无法使用Autowired注解进行自动注入
在SpringBoot项目中使用WebSocket的过程中有其他的业务操作需要注入其它接口来做相应的业务操作,但是在WebSocket的Server类中使用Autowired注解无效,这样注入的对象就是空,在使用过程中会报空指针异常。
余生大大
2022/11/02
5.6K0
在Excel中创建瀑布图
在Excel中很容易创建瀑布图,因为自Excel 2016就推出了瀑布图。然而,改变瀑布颜色稍微有点困难。
fanjy
2023/08/30
6580
在Excel中创建瀑布图
【VBA】在excel中检索文本
虽然在excel文件中检索的vba代码不知道写了多少遍了,每次需要的时候,都是从网上找,然后写。实在是低效的做法。从网上找了一段代码,放在此处,以后需要的时候可以随手拿来。
东风压倒西风
2022/09/06
2.8K0
cmder 无法显示中文
cmder 默认是不支持中文字符的,可以在 Setting > Startup > Environment 下增加一行语言设置:
zucchiniy
2020/05/22
2.6K0
WPF 弹出 popup 里面的 TextBox 无法输入汉字
这是一个 wpf 的bug,在弹出Popup之后,如果 Popup 里面有 TextBox ,这时无法在里面输入文字。
林德熙
2018/09/18
1.7K0
WPF 弹出 popup 里面的 TextBox 无法输入汉字
这是一个 wpf 的bug,在弹出Popup之后,如果 Popup 里面有 TextBox ,这时无法在里面输入文字。
林德熙
2022/08/04
1.8K0
点击加载更多

相似问题

在AJAX和excel中显示汉字

14

在WPF中突出显示/characters行

16

无法在Qt-Embedded 4.7.3中显示汉字

24

在php中如何显示汉字?

30

在HTML文件中显示汉字

13
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文