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. platform_set_drvdata()/platform_get_drvdata()/container_of()【转】

    本文转载自:http://blog.csdn.net/angle_birds/article/details/8443695 platform_set_drvdata(struct platform_ ...

  2. HDU 5969 最大的位或 —— 贪心 + 二进制的理解

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5969 最大的位或 Time Limit: 2000/1000 MS (Java/Others)     ...

  3. 追求代码质量: 用 AOP 进行防御性编程

    原文出处: IBM中国 开发人员测试的主要缺点是:绝大部分测试都是在理想的场景中进行的.在这些情况下并不会出现缺陷 —— 能导致出现问题的往往是那些边界情况. 什么是边界情况呢?比方说,把 null  ...

  4. hdu 1753 大明A+B(大数)

    题意:小数大数加法 思路:大数模板 #include<iostream> #include<stdio.h> #include<string.h> using na ...

  5. [原创]java在线比较两个word文件

    一.项目背景 开发文档管理系统或OA办公系统的时候,实现在线处理word文档的功能比较容易,但是也经常会有客户提出文档版本管理的需求,这就需要同时在线打开两个word文件,对比两个不同版本的word文 ...

  6. python+Django实现Nagios自动化添加监控项目

    最近机房刚上了一批机器(有100台左右),需要使用Nagios对这一批机器进行监控.领导要求两天时间完成所有主机的监控.从原来的经验来看,两天时间肯定完成不了.那怎么办?按照之前的想法,肯定是在nag ...

  7. 操作 AutoIT:界面与自动化操作结合来简化日常劳动: .Net Reactor验证License,设置License,创建License,截图AutoIt自动化实现。(六)

    自动化操作的稳定性,便利性虽然已经满足了要求,但是页面上呈现的按钮太多了,可以做的更加简单一些. 1. 简化页面的按钮,把5个按钮减少至3个,把Display HID按钮功能整合到create lic ...

  8. bzoj 2962 序列操作——线段树(卷积?)

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2962 如果 _,_,_,…… 变成了 (_+k),(_+k),(_+k),…… ,计算就是在 ...

  9. Gulp-webpack简单应用

    1.配置环境:  在  webstorm  的控制台中  (1) cnpm install --save-dev gulp    (2)  cnpm install --save-dev gulp-w ...

  10. Adventure Works 教程

    多维建模(Adventure Works 教程)     欢迎使用 Analysis Services 教程. 本教程通过在所有示例中使用虚构公司 Adventure Works Cycles,说明如 ...