to_date(column,"%yyyy-%mm-%dd")
通常作为循环实现:
memcpy()
使用所有可用的CPU寄存器会更有意义吗?!至少对于大型副本?!
// Pseudo code - for illustration only
while(len--)
++*dst=++*src;
所以问题是。 // Pseudo code - for illustration only
register srcA,dstA
register srcB,dstB
register srcC,dstC
while(len-=numreg)
{
*dstA=*srcA;
*dstB=*srcB;
*dstC=*srcC;
}
实现是否具体考虑了可用的寄存器,还是留给了编译器?!
答案 0 :(得分:1)
使用所有可用的CPU寄存器会更有意义吗?!在 最小的副本?!
真。
最快的实现将使用寄存器在汇编程序中编码:
void X_aligned_memcpy_sse2(void* dest, const void* src, const unsigned long size)
{
__asm
{
mov esi, src; //src pointer
mov edi, dest; //dest pointer
mov ebx, size; //ebx is our counter
shr ebx, 7; //divide by 128 (8 * 128bit registers)
loop_copy:
prefetchnta 128[ESI]; //SSE2 prefetch
prefetchnta 160[ESI];
prefetchnta 192[ESI];
prefetchnta 224[ESI];
movdqa xmm0, 0[ESI]; //move data from src to registers
movdqa xmm1, 16[ESI];
movdqa xmm2, 32[ESI];
movdqa xmm3, 48[ESI];
movdqa xmm4, 64[ESI];
movdqa xmm5, 80[ESI];
movdqa xmm6, 96[ESI];
movdqa xmm7, 112[ESI];
movntdq 0[EDI], xmm0; //move data from registers to dest
movntdq 16[EDI], xmm1;
movntdq 32[EDI], xmm2;
movntdq 48[EDI], xmm3;
movntdq 64[EDI], xmm4;
movntdq 80[EDI], xmm5;
movntdq 96[EDI], xmm6;
movntdq 112[EDI], xmm7;
add esi, 128;
add edi, 128;
dec ebx;
jnz loop_copy; //loop please
loop_copy_end:
}
}
来源: Very fast memcpy for image processing?
答案 1 :(得分:0)
首先你的伪代码是错的,因为你忘了增加指针。当你考虑它时,你的优化就没有任何意义了。
另一个问题是你不能复制任何标准函数必须的任意数量的字节。
当然,你可以使用特定的处理器功能编写高度优化的快速内存移动功能,但它几乎不能替代标准的memcpy功能