- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有一个二维字符数组,我需要对其进行一些操作。在某些情况下,我需要检查字符是否为 a-h。我曾经通过检查字符是否不等于任何其他字符(只有 5 个其他字符)来完成此操作。然而,我最近有了一个想法,我可以改为检查字符是否 < 'j' 以获得相同的结果,希望汇编指令更少。
在我放置的某些地方,它确实导致了小幅加速,但在其他地方却导致了相当大的减速。任何想法为什么会这样? != 相对于 if 语句中的 < 的相对开销是多少?
这是一个示例代码片段:
if( arr[r][c] == arr[r][c+1] && arr[r][c] == arr[r][c+2]
&& arr[r][c] != 'q' && arr[r][c] != 'r' && arr[r][c] != 's' && arr[r][c] != 't')
对比
if( arr[r][c] == arr[r][c+1] && arr[r][c] == arr[r][c+2]
&& arr[r][c] < 'j')
最佳答案
如果我没有正确理解你的问题,你似乎希望检查一个数组列的所有元素是否都在字符 'a' 和 'h' 之间并且相同,并且你想优化这个过程。
如果您碰巧知道一些汇编语言,我强烈建议您使用反汇编程序来找出函数在执行期间究竟发生了什么。所有编译器和优化级别都略有不同。但是,用于比较内存中两个值的最少操作包括:
.将内存中的两个变量加载到处理器寄存器(几个时钟周期)
.对两个寄存器中的值进行相等测试(1个时钟周期)
.根据标志寄存器执行跳转命令(intel 处理器)(另一个时钟周期)
现在这对于处理器来说是最简单的操作,但是由于您有堆叠的比较操作,这些检查所需的时间会累积(特别是内存访问所需的时钟周期)。
因此,要减少这些比较所需的时间,就需要减少比较的次数。请记住,字符“a”到“h”的 ascii 值介于 0x61 和 0x68(十进制 97 到 104)之间。您可以通过大约三个比较操作来确定字符是否在“a”到“h”之间:
if(arr[r][c] >= 97 && arr[r][c] <= 104)
只检查该列的一个值并使用这个小技巧来确定该列中的所有元素是否都相同:
if(((arr[r][c] ^ arr[r][c+1]) + (arr[r][c] ^ arr[r][c+2]) + ...*etc*) == 0)
“xor”('^') 比较需要一个时钟周期,加法也是如此,如果任意两个列实体之间存在任何差异,则该操作将产生非零结果。这种方法应该随着列元素的数量增加线性时间,作为额外的好处,优化编译器可能能够在操作期间将“arr[r][c]”保留在其中一个寄存器中。
关于c++ - 优化:为什么 < 比 multiple 更昂贵!=,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17983889/
我有一个功能是转换 ADO Recordset 进入html: class function RecordsetToHtml(const rs: _Recordset): WideString; 该函
经过几天的研究和讨论,我想出了这种方法来收集访客的熵(你可以看到我的研究历史here) 当用户访问时,我运行此代码: $entropy=sha1(microtime().$pepper.$_SERVE
给定一个无序列表 List ,我需要查找是否存在 String与提供的字符串匹配。 所以,我循环 for (String k : keys) { if (Utils.keysM
我已经搜索过这个问题,但没有找到我正在寻找的答案。 基本上,我想将类构造函数包装在 try/except 子句中,以便它忽略构造函数内特定类型的错误(但无论如何都会记录并打印它们)。我发现做到这一点的
我有一组三个数字,我想将一组数字与另一组数字进行比较。即,第一组中的每个数字小于另一组中的至少一个数字。需要注意的是,第一组中的下一个数字必须小于第二组中的不同数字(即,{6,1,6} 对 {8,8,
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 关闭 9 年前。 Improve this
首先介绍一下背景: 我正在开发一个带有 EJB 模块和应用程序客户端模块的企业应用程序 (ear)。我还使用 hibernate JPA 来实现持久性,并使用 swingx 来实现 GUI。这些是唯一
我正在尝试在我的上网本上运行 Eclipse 以便能够为 Android 进行开发。 您可能已经猜到了,Eclipse 非常慢,并且不容易有效地开发。 我正在使用 Linux Ubuntu 并且我还有
for row, instrument in enumerate(instruments): for col, value in enumerate(instrument):
return not a and not b ^ 我如何以更好的格式表达它 最佳答案 DeMorgan's Law , 也许? return not (a or b) 我认为在这一点上已经足够简单了
我正在尝试让 Font Awesome 图标看起来更 slim https://jsfiddle.net/cliffeee/7L6ehw9r/1/ . 我尝试使用“-webkit-text-strok
假设我有一个名为 vals 的数据框,如下所示: id…………日期…………min_date…… .........最大日期 1…………2016/01/01…………2017/01/01…………2018/
是否有更 Pythonic 的方式来做到这一点?: if self.name2info[name]['prereqs'] is None: se
我有一个函数可以将一些文本打印到它接收到的 ostream&。如果 ostream 以终端为目标,我想让它适应终端宽度,否则默认为某个值。 我现在做的是: 从 ostream 中获取一个 ofstre
这个问题在这里已经有了答案: Should a retrieval method return 'null' or throw an exception when it can't produce
我有这个 bc = 'off' if c.page == 'blog': bc = 'on' print(bc) 有没有更 Pythonic(和/或更短)的方式在 Python 中编写? 最佳
输入:一个包含 50,000 行的 CSV;每行包含 910 列值 0/1。 输出:运行我的 CNN 的数据框。 我编写了一个逐行读取 CSV 的代码。对于每一行,我将数据分成两部分,称为神经元(90
据我所知,with block 会在您退出 block 后自动调用 close(),并且它通常用于确保不会忘记关闭一个文件。 好像没有技术上的区别 with open(file, 'r+') as f
我有一个使用 Entity Framework V6.1.1 的 MVC 5 网站。 Entity Framework DbContext 类和模型最初都在网站项目中。这个项目有 3 个 DbCont
我是编程新手,在尝试通过将 tableView 和关联 View 的创建移动到单独的类并将委托(delegate)和数据源从 VC 移动到单独的类来精简我的 ViewController 时遇到了一些
我是一名优秀的程序员,十分优秀!