小编use*_*424的帖子

C中的SHA256性能优化

我需要经常散列一个大的值数据库.因此,需要快速实现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)

c optimization sha256

14
推荐指数
3
解决办法
1万
查看次数

GLSL着色器在需要时不展开循环

我的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 glsl fragment-shader loop-unrolling

8
推荐指数
1
解决办法
5601
查看次数

索引GL_TRIANGLES与索引GL_TRIANGLE_STRIP

关于索引三角形或三角形条带之间的渲染性能一直存在很多嗡嗡声.但我相信有一个案例没有被充分考虑.

索引三角形在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的三分之一).

opengl performance gpu gl-triangle-strip

7
推荐指数
1
解决办法
3025
查看次数

转换为无分支的连续if语句

我在那里试图弄清楚如何将以下代码的最后两个"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)

c optimization assembly if-statement

6
推荐指数
1
解决办法
260
查看次数

php 内容从未被浏览器缓存?

我已经为一个网站运行了一些测试,涉及动态内容(在这种情况下通过 PHP/nginx)如何被各种浏览器缓存。

我得出的结论是,默认情况下,php 文件永远不会从缓存中提取,即使在移动浏览器中,即使在响应中没有Cache-Control也没有Expires参数,即使我不发送 POST 请求,我只是按照链接到页面。它们总是被重新下载。相比之下,css/js/image 文件是从缓存中获取的。

这对我有好处,因为我希望动态 html 始终访问后端并具有 Varnish 或我自己的 php/文件系统实现形式的缓存机制。

这是默认情况下通常预期的行为吗?顺便说一下,我正在使用会话 cookie。

php browser mobile caching nginx

5
推荐指数
1
解决办法
1933
查看次数

使用许多紧密频率时,奇怪的FFT达到峰值

我正在使用这个python代码的略微修改版本进行频率分析: FFT错误值?

假设我在时域中有一组正弦波,频率非常接近,同时共享相同的幅度.这是它们在频域中的样子,在1024个样本上使用FFT,我从中取出后半部分,给出512个分辨率的分辨率:

蓝色:矩形窗口. 粉红色:Nuttall窗口

这是我在同一组波上应用FFT但这次有128个样本(64个分档):

蓝色:矩形窗口. 粉红色:Nuttall窗口

我期待一个高原频率响应,但看起来中心的波浪被取消了.我看到的那些"角"是什么?这是正常的吗?

python fft frequency

3
推荐指数
1
解决办法
368
查看次数

Python有8KiB字节的长文件I/O缓存吗?

我正在调查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)

python windows file-io caching python-3.x

1
推荐指数
1
解决办法
398
查看次数