可以说我们有一个负整数说int a;
是否有更快的-a实现?
我必须对此进行一些按位操作吗?
Java编程语言中最昂贵的(字节码和cpu周期)语句是什么?
是否建议将小循环(如果可能)从长度 - 1减少到零,而不是计算长度 - 1?
1.)倒计时
for (int i = a.length - 1; i >= 0; i--) {
if (a[i] == key) return i;
}
Run Code Online (Sandbox Code Playgroud)
2.)数数
for (int i = 0; i < a.length; i++) {
if (a[i] == key) return i;
}
Run Code Online (Sandbox Code Playgroud)
第一个比第二个快一点(因为比较零更快)但在我看来更容易出错.此外,第一个可能无法通过JVM的未来改进进行优化.有什么想法吗?
我需要一个函数来有效地反转golang中的切片.(我的具体需求是反转[]字节的前缀).
我查看了Effective Go中的示例,objdump -Sd并生成了大量的样板来检查数组索引.即使交换效率也太低.
我被告知duff设备不适用于PHP,因为交换机和案例结构的工作方式不同.我在php.net上发现这个duff devive,我的问题是这个设备有什么问题?或者我不明白duff设备?在我的汇编程序中,我可以使用简单的命令展开循环,当它编译时,我得到一个展开的循环.
<?php
$n = $ITERATIONS % 8;
while ($n--) $val++;
$n = (int)($ITERATIONS / 8);
while ($n--) {
$val++;
$val++;
$val++;
$val++;
$val++;
$val++;
$val++;
$val++;
}
?>
Run Code Online (Sandbox Code Playgroud) 假设:
const int n = bigNumber;
float* f = someData;
Run Code Online (Sandbox Code Playgroud)
转换是否有任何意义
for (int i = 0; i < n; i++)
{
f[i] += 1;
}
Run Code Online (Sandbox Code Playgroud)
至
float* lastF = f + n;
for (float* i = f; i < lastF; i++)
{
*i += 1;
}
Run Code Online (Sandbox Code Playgroud)
天真地看着这个,似乎我为每次迭代(the f[i])保存了一个加法运算.
当然,这假设我对循环内的索引器的值没有兴趣.
我会检查拆卸,但我读这些很糟糕.
我需要从以下两个函数中删除尽可能多的条件:
inline int inc_with_1bit_saturation(int counter)
{
if (counter == 1)
return --counter;
return ++counter;
}
void branch_prediction_1bit_saturation(int* input, int* output, int size)
{
int counter = 0;
for (int i = 0; i < size; ++i)
{
if (input[i] != counter)
{
counter = inc_with_1bit_saturation(counter);
output[i] = 0;
}
else output[i] = 1;
}
}
Run Code Online (Sandbox Code Playgroud)
我怎么能这样做,什么if分支是绝对必要的,不能被删除,哪一个可以被简单的按位运算或类似的东西取代?
根据User JSF的精彩提示,代码现在看起来像这样:
void branch_prediction_1bit_saturation(int* input, int* output, int size)
{
int counter = 0;
for (int i = 0; i …Run Code Online (Sandbox Code Playgroud) 我正在考虑在纯装配中实现SHA3.SHA3的内部状态为17个64位无符号整数,但由于它使用了转换,如果寄存器中有44个这样的整数,则可以实现最佳情况.另外还有一个临时寄存器.在这种情况下,我将能够在寄存器中进行整个转换.
但这是不现实的,优化可能一直到甚至只有几个寄存器.不过,根据这个问题的答案,更多可能更好.
我想至少使用MMX寄存器进行快速存储,即使我需要交换到其他寄存器进行计算.但我担心这是古建筑.
在MMX寄存器和RAX之间的数据传输是否比在堆栈上索引u64并从可能是L1缓存中访问它们更快?或者即便如此,除了我应该注意的速度考虑之外,还有隐藏的陷阱吗?我对一般情况感兴趣,所以即使我的计算机上的一个比另一个更快,它仍然可能是不确定的.
我需要遍历大量(2D)数据,并且仅有时处理特殊情况。对于我的应用程序来说,速度是最关键的因素。
(我)很快想到的选择是:
选项A:
void ifInLoop(bool specialCase, MyClass &acc) {
for (auto i = 0; i < n; ++i) {
for (auto j = 0; j < n; ++j) {
if (specialCase) {
acc.foo();
} else {
acc.bar();
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
选项B:
void loopsInIf(bool specialCase, MyClass &acc) {
if (specialCase) {
for (auto i = 0; i < n; ++i) {
for (auto j = 0; j < n; ++j) {
acc.foo();
}
}
} else { …Run Code Online (Sandbox Code Playgroud) 我在x86-64汇编中开发了一个程序,该程序需要通过相同的操作进行多次迭代:
IMUL rdx, 3 # rdx is always different
Run Code Online (Sandbox Code Playgroud)
但是,我需要使运行时更快,因此我从上面想到了对该特定行的优化:
MOV rcx, rdx
SHL rdx, 1
ADD rdx, rcx
Run Code Online (Sandbox Code Playgroud)
现在我问你们:这种修改会改善程序的运行时间(减少时钟),还是我应该坚持使用该IMUL命令?
c++ ×4
optimization ×4
assembly ×2
java ×2
x86 ×2
bytecode ×1
c ×1
duffs-device ×1
go ×1
intel ×1
mmx ×1
php ×1
reverse ×1
visual-c++ ×1
x86-64 ×1