memcpy?memmove?

//#pragma GCC optimize(2)
#include<bits/stdc++.h>
using namespace std;
const int n=;
int a[n+],b[n+],c[n+],d[n+],e[n+],f[n+];
int main()
{
int i;
srand();
for(i=;i<=n;i++) a[i]=rand();
clock_t st1=clock();
memcpy(b+,a+,sizeof(int)*n);
clock_t ed1=clock();
clock_t st2=clock();
memmove(c+,a+,sizeof(int)*n);
clock_t ed2=clock();
clock_t st3=clock();
for(i=;i<=n;i++) d[i]=a[i];
clock_t ed3=clock();
clock_t st4=clock();
for(i=;i<=n-;i+=)
{
e[i]=a[i];
e[i+]=a[i+];
e[i+]=a[i+];
e[i+]=a[i+];
}
(i<=n)&&(e[i]=a[i]);
(i+<=n)&&(e[i+]=a[i+]);
(i+<=n)&&(e[i+]=a[i+]);
clock_t ed4=clock();
clock_t st5=clock();
for(i=;i<=n-;i+=)
{
f[i]=a[i];
f[i+]=a[i+];
f[i+]=a[i+];
f[i+]=a[i+];
f[i+]=a[i+];
f[i+]=a[i+];
f[i+]=a[i+];
f[i+]=a[i+];
}
(i<=n)&&(f[i]=a[i]);
(i+<=n)&&(f[i+]=a[i+]);
(i+<=n)&&(f[i+]=a[i+]);
(i+<=n)&&(f[i+]=a[i+]);
(i+<=n)&&(f[i+]=a[i+]);
(i+<=n)&&(f[i+]=a[i+]);
(i+<=n)&&(f[i+]=a[i+]);
clock_t ed5=clock();
cout<<"time1:"<<ed1-st1<<' '<<memcmp(a+,b+,sizeof(int)*n)<<'\n';
cout<<"time2:"<<ed2-st2<<' '<<memcmp(a+,c+,sizeof(int)*n)<<'\n';
cout<<"time3:"<<ed3-st3<<' '<<memcmp(a+,d+,sizeof(int)*n)<<'\n';
cout<<"time4:"<<ed4-st4<<' '<<memcmp(a+,e+,sizeof(int)*n)<<'\n';
cout<<"time5:"<<ed5-st5<<' '<<memcmp(a+,f+,sizeof(int)*n)<<'\n';
return ;
}

不开优化:
time1:139254 0
time2:198093 0
time3:601853 0
time4:588247 0
time5:598584 0

O2:
time1:138256 0
time2:139235 0
time3:426570 0
time4:322532 0
time5:301933 0

Ofast:
time1:137893 0
time2:140585 0
time3:422154 0
time4:309306 0
time5:298620 0

很显然在大数据(n=50000000)下memcpy最快

另外,在小数据(比如n=26)下,测试得到明显直接赋值(time3)最快

在较小数据(比如n=1000)下,测试得到memmove最快?


快速乘

测试对比程序:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll rd()
{
return rand()|(ll(rand())<<);
}
ll md;
ll mul1(ll x,ll y)
{
x%=md;y%=md;
ll t=x*y-ll((long double)x/md*y+0.5)*md;
return t<?t+md:t;
}
ll mul2(ll x,ll y)
{
x%=md;y%=md;
ll t=x*y-ll((long double)x*y/md+0.5)*md;
return t<?t+md:t;
}
ll mul3(ll x,ll y)
{
x%=md;y%=md;
ll t=x*y-ll((long double)x/md*y+1e-)*md;
return t<?t+md:t;
}
ll mul0(ll x,ll y)
{
return __int128(x)*y%md;
}
ll a,b;
int main()
{
int T=;
srand();
while()
{
T++;
ll a=rd(),b=rd();
md=rd();//%ll(1e18);
//cout<<a<<' '<<b<<' '<<md<<'\n';
ll t1=mul1(a,b),t2=mul0(a,b);//可将mul1改为mul2/mul3
//cout<<t1<<' '<<t2<<'\n';
if(t1!=t2)
{
printf("%d\n",T);
puts("test");
int t;cin>>t;
}
//int t;cin>>t;
}
return ;
}

经过一些测试,可以发现,mul3效果最差(在模数>=1e17时,100000组以内就拍出锅);应该是1e-8不够

mul2效果没有mul1好(模数不设额外上限时,100000组以内出锅;上限1e18时,20秒不出锅)

mul1效果最好(模数不设额外上限时,20秒不出锅)

原因就不知道了。。。

memcpy/memmove?快速乘?的更多相关文章

  1. 自己实现的库函数2(memset,memcmp,memcpy,memmove)

    memset,memcmp,memcpy,memmove是对内存进行管理的库函数,为了更好的理解和使用这几个函数,自己用C语言实现一下~ //内存设置函数void* my_memset(void* d ...

  2. memset memcmp memcpy memmove 自己实现

    memset memcmp memcpy memmove 自己实现 memset #include <stdio.h> #include <memory.h> #include ...

  3. memcpy memmove区别和实现

    memcpy与memmove的目的都是将N个字节的源内存地址的内容拷贝到目标内存地址中. 但当源内存和目标内存存在重叠时,memcpy会出现错误,而memmove能正确地实施拷贝,但这也增加了一点点开 ...

  4. 自己实现内存操作函数memset(),memcmp(),memcpy(),memmove()

    1.memset()内存设置函数(初始化) void *my_memset(void* dest, int c, size_t count) { assert(dest != NULL); char  ...

  5. 走进C标准库(7)——"string.h"中函数的实现memcmp,memcpy,memmove,memset

    我的memcmp: int memcmp(void *buf1, void *buf2, unsigned int count){ int reval; while(count && ...

  6. C的memset,memcpy,strcpy 的区别 及memset memcpy memmove源码

    extern void *memcpy(void *dest,void *src,unsigned int count);#include <string.h>   功能:由src所指内存 ...

  7. 一些关于memcpy memmove函数的区别,和模拟实现

    memcpy: 它是c和c++使用的内存拷贝函数,memcpy函数的功能是从源src所指的内存地址的起始位置开始拷贝n个字节到目标dest所指的内存地址的起始位置中. 函数原型:void* memcp ...

  8. strcpy和memcpy,memmove函数的区别

    strcpy和memcpy的区别 strcpy和memcpy都是标准C库函数,它们有下面的特点. strcpy提供了字符串的复制.即strcpy只用于字符串复制,并且它不仅复制字符串内容之外,还会复制 ...

  9. strcpy,memcpy,memmove和内存重叠分析

    一:strcpy函数用法和实现: /* GNU-C中的实现(节选): */ char* strcpy(char *d, const char *s) { char *r=d; while((*d++= ...

随机推荐

  1. HTML初级教程 表单form

    表单本身是没有什么用的.这需要编一个程序来处理输入表单中的数据.这也超出了本站指南的范围.如果使用网络服务器来放置HTML,你能够自助地找到一些简单的教程,开发一个服务器端的程序使一个发送到Email ...

  2. 装饰器 decorator

    装饰器 def document_it(func): def new_function(*args, **kwargs): print('Running function:', func.__name ...

  3. python 基础之第四天

    例子1: 打印列表每个元素对应的索引 [root@master script]# vim suoyin.py #!/usr/bin/python # coding:utf-8 alist = ['fu ...

  4. inline关键字的用法详解

    1. 引入inline关键字的原因 在c/c++中,为了解决一些频繁调用的小函数大量消耗栈空间(栈内存)的问题,特别的引入了inline修饰符,表示为内联函数. 栈空间就是指放置程序的局部数据(也就是 ...

  5. Java操作系统硬件的方法Unsafe

    通常Java代码都是运行在JVM中而不能直接访问系统硬件如进行内存分配释放等,但如果有需要跳过JVM直接用Java访问系统硬件,比如像C语言指针一样操作的话就可以调用Unsafe对象相关方法. 1.U ...

  6. 移植最新版libmemcached到VC++的艰苦历程和经验总结(下)

    结果如何呢?我的VC++测试用例还是不能调用该接口的接口方法,只是这次的报错方式有所改变,提示是每个C/C++程序员最不愿意看到的“内存地址访问违规”,这一次我确实被郁闷了,这是为什么呢? 五.gcc ...

  7. Struts过滤器

    StrutsPrepareAndExecuteFilter过滤器其实是包含2部分的 StrutsPrepareFilter:做准备 StrutsExecuteFilter:进入Struts2的核心处理 ...

  8. Resistance

    题意: 给出一个由n个节点和m个二元电阻元件组成的电路,求问节点1到节点n的等效电阻. 解法: 应用电子电路分析中的基尔霍夫定律,对于每一个点有流量平衡,得 对于点$x$有 $$I_{出} + \su ...

  9. codevs-1205

    1205 单词翻转 题目描述 Description 给出一个英语句子,希望你把句子里的单词顺序都翻转过来 输入描述 Input Description 输入包括一个英语句子. 输出描述 Output ...

  10. Laravel中的模板引擎Blade

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...