【问题标题】:Cost/benefit of multi-threaded text processing多线程文本处理的成本/收益
【发布时间】:2009-05-03 06:33:43
【问题描述】:

我正在为 iPhone 开发一个实时语法荧光笔,我创建了一个自定义 UIView,它接受一个字符串,解析它,然后在它的 drawRect: 方法中突出显示它。我还实现了一个闪烁的光标。但是,它开始变得有点慢,我认为当我实现多行处理和块处理时,它会更慢。但是,我尝试将[formattedTextView setNeedsDisplayInRect:] 调用放在我的视图控制器中的一个函数中,然后使用[self performSelectorInBackground:@selector(updateDisplay) withObject:nil] 调用一个单独的线程。键盘现在响应速度更快了,但这似乎是在单核处理器上对线程的错误使用。

这样做有什么问题吗?

谢谢

【问题讨论】:

    标签: c objective-c multithreading


    【解决方案1】:

    正如您自己指出的那样,在单处理器上多线程不会带来巨大的性能提升,但会带来稳定性和复杂性的损失。

    动态语法着色是一个难题,充满了优化的可能性:

    • 您是否在整个文本中应用了一堆正则表达式? (坏)或者你是否解析文本以保存在一个有效的数据结构中,如 ast?
    • 您是否将彩色绘画限制在可见区域?

    【讨论】:

    • 我最终删除了后台处理,因为如果快速连续输入许多字符会导致延迟。至于你的其他观点: - 我将正则表达式应用于当前可编辑的行。 - 我只通过调用 setNeedsDisplayInRect: 来更新当前行,UIView 的其余部分保持彩色。在我看来,减速的主要原因是闪烁的光标(在 awakeFromNib 中设置了 CABasicAnimation 的 CALayer)有没有办法优化这个动画?另外,什么是ast?我以前没听说过,我用的是 NSMutableArray。
    【解决方案2】:

    我正在开发一个实时语法荧光笔

    您是在做关键字突出显示还是编写了 BNF 解析器?

    对于后者,为什么不让它在一个线程中运行呢? GUI 仅显示到目前为止已解码的所有内容的颜色。这样您就可以获得即时更新,但会延迟着色。

    【讨论】:

    • 我正在使用正则表达式进行关键字突出显示,一个实际的解析器会很好,但我不确定我能不能写一个。谢谢,凯尔
    • BNF 解析器比您想象的要容易得多 - 这是一个必需的概念飞跃,您需要让您的大脑围绕基本概念 - 实际编码非常简单。
    • 您是否知道任何可以帮助我理解这个概念的代码/文章?因为解析器远远优于单纯的关键字突出显示。谢谢
    猜你喜欢
    • 2011-04-02
    • 2010-10-31
    • 1970-01-01
    • 1970-01-01
    • 2020-10-01
    • 2013-01-15
    • 1970-01-01
    • 2022-01-13
    • 2019-04-01
    相关资源
    最近更新 更多