我总是假设在做(a % 256)优化器时自然会使用有效的按位操作,就像我写的那样(a & 0xFF).
在编译器资源管理器gcc-6.2(-O3)上进行测试时:
// Type your code here, or load an example.
int mod(int num) {
return num % 256;
}
mod(int):
mov edx, edi
sar edx, 31
shr edx, 24
lea eax, [rdi+rdx]
movzx eax, al
sub eax, edx
ret
Run Code Online (Sandbox Code Playgroud)
在尝试其他代码时:
// Type your code here, or load an example.
int mod(int num) {
return num & 0xFF;
}
mod(int):
movzx eax, dil
ret
Run Code Online (Sandbox Code Playgroud)
好像我完全错过了一些东西.有任何想法吗?
在关于优化和代码风格的C++问题中,在优化副本的上下文中,有几个答案提到了"SSO" std::string.在这种情况下,SSO意味着什么?
显然不是"单点登录"."共享字符串优化",或许?
Magento通常非常慢吗?
这是我第一次体验它,管理面板只需要很长时间来加载和保存更改.它是包含测试数据的默认安装.
托管它的服务器可以超快速地为其他非Magento站点提供服务.什么是Magento使用的PHP代码使它变得如此缓慢,以及可以采取哪些措施来解决它?
我遇到了很多优化提示,说明你应该将你的课程标记为密封以获得额外的性能优势.
我运行了一些测试以检查性能差异,但没有找到.难道我做错了什么?我错过了密封课程会给出更好结果的情况吗?
有没有人进行测试并看到了差异?
帮我学习:)
为什么Java API会使用int,何时short甚至byte是足够的?
示例:DAY_OF_WEEK类中的字段Calendar使用int.
如果差异太小,那么为什么存在这些数据类型(short,int)?
当您在MS SQL Server(我使用的是版本2005)中的列或列数上创建索引时,您可以指定每列上的索引是升序还是降序.我很难理解为什么这个选择就在这里.使用二进制排序技术,任何一种查找都不会那么快吗?它选择哪个订单有什么区别?
在一个非常大的阵列上是否有任何可能的随机访问优化(我目前使用uint8_t,我问的是什么更好)
uint8_t MyArray[10000000];
Run Code Online (Sandbox Code Playgroud)
当数组中任何位置的值为
那么,有没有什么比uint8_t用于此的数组更好?它应该尽可能快地以随机顺序循环遍历整个阵列,并且这对RAM带宽非常重,因此当有多个线程同时为不同的阵列执行时,当前整个RAM带宽很快就饱和了.
我问,因为实际上已知除了5%之外几乎所有的值都是0或1时,拥有如此大的数组(10 MB)效率非常低效.因此当数组中所有值的95%时实际上只需要1位而不是8位,这会将内存使用量减少几乎一个数量级.感觉必须有一个更节省内存的解决方案,这将大大减少为此所需的RAM带宽,因此随机访问也会明显更快.
是否有可靠的跨浏览器方式来检测选项卡是否具有焦点.
场景是我们有一个应用程序定期轮询股票价格,如果页面没有焦点我们可以停止轮询并节省每个人的交通噪音,特别是当人们是打开不同组合的几个选项卡的粉丝.
是window.onblur和window.onfocus这个选项?
以下代码在调试模式和发布模式下生成不同的结果(使用Visual Studio 2008):
int _tmain(int argc, _TCHAR* argv[])
{
for( int i = 0; i < 17; i++ )
{
int result = i * 16;
if( result > 255 )
{
result = 255;
}
printf("i:%2d, result = %3d\n", i, result) ;
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
调试模式的输出,如预期的那样:
i: 0, result = 0
i: 1, result = 16
(...)
i:14, result = 224
i:15, result = 240
i:16, result = 255
Run Code Online (Sandbox Code Playgroud)
释放模式的输出,其中i:15结果不正确:
i: 0, result = 0
i: 1, result …Run Code Online (Sandbox Code Playgroud) 考虑这个简单的循环:
float f(float x[]) {
float p = 1.0;
for (int i = 0; i < 959; i++)
p += 1;
return p;
}
Run Code Online (Sandbox Code Playgroud)
如果您使用gcc 7(快照)或clang(主干)进行编译,-march=core-avx2 -Ofast则会得到与之非常相似的内容.
.LCPI0_0:
.long 1148190720 # float 960
f: # @f
vmovss xmm0, dword ptr [rip + .LCPI0_0] # xmm0 = mem[0],zero,zero,zero
ret
Run Code Online (Sandbox Code Playgroud)
换句话说,它只是将答案设置为960而不进行循环.
但是,如果您将代码更改为:
float f(float x[]) {
float p = 1.0;
for (int i = 0; i < 960; i++)
p += 1;
return p;
}
Run Code Online (Sandbox Code Playgroud)
生成的程序集实际执行循环求和?例如clang给出:
.LCPI0_0:
.long 1065353216 # …Run Code Online (Sandbox Code Playgroud) optimization ×10
c++ ×4
c ×2
performance ×2
.net ×1
arrays ×1
clang ×1
compiler-bug ×1
frameworks ×1
gcc ×1
indexing ×1
java ×1
java-api ×1
javascript ×1
magento ×1
php ×1
polling ×1
sql ×1
sql-server ×1
string ×1
types ×1