int rand(void)
汇编如何call? 要不手工写个小随机算法插入里面做位随机 :) 找到个比较复杂的
给汇编化加位随机化
:lol
DWORD BitX;
void BitRandomInit(DWORD seed)
{
DWORD i;
DWORD s = seed;
// make random numbers and put them into the buffer
for (i = 0; i < 5; i++) {
s = s * 29943829 - 1;
BitX[ i ] = s;
}
}
DWORD BitRandom(void)
{
__asm
{
mov ecx, 31
mov eax, 0
loop1:
movebx, 2111111111
movd xmm5, ebx
movd xmm1, dword ptr
pmuludq xmm5, xmm1
movedx, 1492
movd xmm6, edx
movd xmm2, dword ptr
pmuludq xmm6, xmm2
paddq xmm5, xmm6
movd dword ptr , xmm2
movesi, 1776
movd xmm7, esi
movd xmm3, dword ptr
pmuludq xmm7, xmm3
paddq xmm5, xmm7
movd dword ptr , xmm3
movedi, 5115
movd xmm0, edi
movd xmm4, dword ptr
pmuludq xmm0, xmm4
paddq xmm5, xmm0
movd dword ptr , xmm4
movd xmm0, dword ptr
paddq xmm0, xmm5
movd edx, xmm0
psrlq xmm0, 32
movd dword ptr , xmm0
mov dword ptr , edx
andedx, 1
shl edx, cl
add eax, edx
sub ecx, 1
jnc loop1
}
} 这样应该会好一些。不过这个要看计算随机数部分数据占用整个计算的比例是多少。通常,如果前面部分计算占用比列过大,很难衡量后面部分代码的时间,因为我们测量到的大部分时间是前面计算的时间。
还有,同样一段代码,最好多运行几次,看看运行时间的稳定性如何,如果多次运行发现时间变化相对比较大(比如已经超出两种不同算法得到的时间差),那么测量的意义也不是很大。 终于通过调试了
10万的时间是109ms 封存
处理完128位乘法如果有兴趣可能写个BBS位算法
DWORD BitX;
void BitRandomInit(DWORD seed)
{
DWORD i;
DWORD s = seed;
// make random numbers and put them into the buffer
for (i = 0; i < 5; i++)
{
s = s * 29943829 - 1;
BitX[ i ] = s;
}
}
DWORD BitRandom(void)
{
__asm
{
mov ecx, 31
mov eax, 0
loop1:
mov ebx, 2111111111
movd xmm5, ebx
movd xmm1, dword ptr //BitX
pmuludq xmm5, xmm1
mov edx, 1492
movd xmm6, edx
movd xmm2, dword ptr //BitX
pmuludq xmm6, xmm2
paddq xmm5, xmm6
movd dword ptr , xmm2 //BitX
mov esi, 1776
movd xmm7, esi
movd xmm3, dword ptr //BitX
pmuludq xmm7, xmm3
paddq xmm5, xmm7
movd dword ptr , xmm3 //BitX
mov edi, 5115
movd xmm0, edi
movd xmm4, dword ptr //BitX
pmuludq xmm0, xmm4
paddq xmm5, xmm0
movd dword ptr , xmm4 //BitX
movd xmm0, dword ptr //BitX
paddq xmm0, xmm5
movd edx, xmm0
psrlq xmm0, 32
movd dword ptr , xmm0 //BitX
mov dword ptr , edx //BitX
and edx, 1
shl edx, cl
add eax, edx
sub ecx, 1
jnc loop1
}
}这个代码很有价值,重整理下
页:
1
[2]