我需要经常散列一个大的值数据库.因此,需要快速实现SHA-2哈希.我目前正在使用SHA256.
我现在使用的sha256_transform算法是这样的:http://bradconte.com/sha256_c (下面的代码)
我已经分析了我的代码,这段代码占用了每个哈希值的96%的计算时间,这使得这个功能对我的目标至关重要.
它在一个64字节长的二进制字符串上运行,data[]
并输出结果ctx->state
.
我要求更快版本的这个功能.请记住,即使是轻微的修改也会对速度造成负面影响.
#define uchar unsigned char
#define uint unsigned int
#define ROTLEFT(a,b) (((a) << (b)) | ((a) >> (32-(b))))
#define ROTRIGHT(a,b) (((a) >> (b)) | ((a) << (32-(b))))
#define CH(x,y,z) (((x) & (y)) ^ (~(x) & (z)))
#define MAJ(x,y,z) (((x) & (y)) ^ ((x) & (z)) ^ ((y) & (z)))
#define EP0(x) (ROTRIGHT(x,2) ^ ROTRIGHT(x,13) ^ ROTRIGHT(x,22))
#define EP1(x) (ROTRIGHT(x,6) ^ ROTRIGHT(x,11) ^ ROTRIGHT(x,25))
#define SIG0(x) (ROTRIGHT(x,7) ^ ROTRIGHT(x,18) …
Run Code Online (Sandbox Code Playgroud) 我的9600GT讨厌我.
片段着色器:
#version 130
uint aa[33] = uint[33](
0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,
0,0,0
);
void main() {
int i=0;
int a=26;
for (i=0; i<a; i++) aa[i]=aa[i+1];
gl_FragColor=vec4(1.0,0.0,0.0,1.0);
}
Run Code Online (Sandbox Code Playgroud)
如果a=25
程序以3000 fps运行.
如果a=26
程序以20 fps运行.
如果aa
未出现<= 32问题的大小.
视口大小为1000x1000.
仅当大小aa
> 32 时才会出现问题.
的值a
作为阈值与调用循环内的阵列变化(aa[i]=aa[i+1]+aa[i-1]
给出了不同的期限).
我知道gl_FragColor
已被弃用.但那不是问题.
我的猜测是,如果> 25且大小(aa)> 32,GLSL不会自动展开循环.为什么.它取决于阵列大小的原因是人类所不知道的.
这里解释了一个非常相似的行为:http:
//www.gamedev.net/topic/519511-glsl-for-loops/
手动展开循环确实解决了问题(3000 fps),即使aa
大小> 32:
aa[0]=aa[1];
aa[1]=aa[2];
aa[2]=aa[3];
aa[3]=aa[4];
aa[4]=aa[5];
aa[5]=aa[6];
aa[6]=aa[7];
aa[7]=aa[8];
aa[8]=aa[9];
aa[9]=aa[10];
aa[10]=aa[11];
aa[11]=aa[12];
aa[12]=aa[13];
aa[13]=aa[14];
aa[14]=aa[15]; …
Run Code Online (Sandbox Code Playgroud) 关于索引三角形或三角形条带之间的渲染性能一直存在很多嗡嗡声.但我相信有一个案例没有被充分考虑.
索引三角形在OpenGl中呈现如下:
glDrawElements(GL_TRIANGLES, ...);
Run Code Online (Sandbox Code Playgroud)
但由于某些原因,很多人认为只有这样才能渲染条带:
glDrawArrays(GL_TRIANGLE_STRIP, ...);
Run Code Online (Sandbox Code Playgroud)
那里有一些非常好的索引器(Forsyth,Tipsify,仅举几例),它们可以优化网格,以便于在GL_TRIANGLES模式下渲染GPU转换缓存.理想情况下,它们可以实现每个三角形的0.5个渲染顶点或类似的东西.
但为什么不这样做呢?
glDrawElements(GL_TRIANGLE_STRIP, ...);
Run Code Online (Sandbox Code Playgroud)
我的意思是,您将条带渲染的低索引带宽与上述索引器提供的高效GPU转换缓存使用相结合.几乎没有任何修改,我是否正确地说,优化条带的条带索引器也是Tcache友好的可能是一个好主意?
可能它不会达到0.5的目标,但至少可能达到0.6?另外,不要忘记大量的索引带宽增益(可能是GL_TRIANGLES的三分之一).
我在那里试图弄清楚如何将以下代码的最后两个"if"语句转换为无分支状态.
int u, x, y;
x = rand() % 100 - 50;
y = rand() % 100 - 50;
u = rand() % 4;
if ( y > x) u = 5;
if (-y > x) u = 4;
Run Code Online (Sandbox Code Playgroud)
或者,如果上述情况太难,您可以将它们视为:
if (x > 0) u = 5;
if (y > 0) u = 4;
Run Code Online (Sandbox Code Playgroud)
我认为让我感到困惑的是那些没有else
接球手的事实.如果是这种情况,我可能已经适应了无分支abs
(或max
/ min
)功能的变体.
rand()
您看到的功能不是真实代码的一部分.我这样添加它们只是为了暗示变量的预期范围x
,y
并且u
可能在两个分支发生时具有这些变量.
允许装配机器代码.
编辑:
经过一些braingrinding我设法组建一个工作无分支版本:
int u, x, y;
x = …
Run Code Online (Sandbox Code Playgroud) 我已经为一个网站运行了一些测试,涉及动态内容(在这种情况下通过 PHP/nginx)如何被各种浏览器缓存。
我得出的结论是,默认情况下,php 文件永远不会从缓存中提取,即使在移动浏览器中,即使在响应中没有Cache-Control
也没有Expires
参数,即使我不发送 POST 请求,我只是按照链接到页面。它们总是被重新下载。相比之下,css/js/image 文件是从缓存中获取的。
这对我有好处,因为我希望动态 html 始终访问后端并具有 Varnish 或我自己的 php/文件系统实现形式的缓存机制。
这是默认情况下通常预期的行为吗?顺便说一下,我正在使用会话 cookie。
我正在使用这个python代码的略微修改版本进行频率分析: FFT错误值?
假设我在时域中有一组正弦波,频率非常接近,同时共享相同的幅度.这是它们在频域中的样子,在1024个样本上使用FFT,我从中取出后半部分,给出512个分辨率的分辨率:
这是我在同一组波上应用FFT但这次有128个样本(64个分档):
我期待一个高原频率响应,但看起来中心的波浪被取消了.我看到的那些"角"是什么?这是正常的吗?
我正在调查Python 3.6.0中的文件I/O性能.鉴于此脚本包含3个测试:
#!python3
import random, string, time
strs = ''.join(random.choice(string.ascii_lowercase) for i in range(1000000))
strb = bytes(strs, 'latin-1')
inf = open('bench.txt', 'w+b')
inf.write(strb)
for t in range(3):
inf.seek(0)
inf.read(8191)
for t in range(3):
inf.seek(0)
inf.read(8192)
for t in range(3):
inf.seek(0)
inf.read(8193)
inf.close()
Run Code Online (Sandbox Code Playgroud)
Procmon发现以下操作发生(标签行是我的评论):
# Initial write
Offset: 0, Length: 1.000.000
# The 3 8191-long reads only produce one syscall due to caching:
Offset: 0, Length: 8.192
# However, if the read length is exactly 8192, python doesn't take advantage:
Offset: …
Run Code Online (Sandbox Code Playgroud) c ×2
caching ×2
opengl ×2
optimization ×2
python ×2
assembly ×1
browser ×1
fft ×1
file-io ×1
frequency ×1
glsl ×1
gpu ×1
if-statement ×1
mobile ×1
nginx ×1
performance ×1
php ×1
python-3.x ×1
sha256 ×1
windows ×1