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. iOS 两个tableview的 瀑布流

    iOS 两个tableview的 瀑布流1. [代码]Objective-C     ////  DocViewController.m//  getrightbutton////  Created ...

  2. flume 日志收集单节点

    flume 是 cloudera公司研发的日志收集系统,采用3层结构:1. agent层,用于直接收集日志;2.connect 层,用于接受日志; 3. 数据存储层,用于保存日志.由一到多个maste ...

  3. 烂笔头——JAVA.String

    人们说 Sting+ 的效率很低 String+的编译步骤是: new StringBuilder() new String.valueof() StringBuilder.<init> ...

  4. JavaScript ES6中export、export default、import用法和区别

    相信熟悉JS ES6的同学都知道export.export default是导出,import是导入的意思. 那么问题就来了, 1.import 导入要怎么用? 2.export.export def ...

  5. Gibonacci number-斐波那契数列

    Description In mathematical terms, the normal sequence F(n) of Fibonacci numbers is defined by the r ...

  6. python读文件和写文件

    f=open('D:\\wangdongjie\\files\\webservice\\baidu\\3.txt','r+') f.write('中国电视台1][][23qwe12f我是一个小小的石头 ...

  7. Unity3D 开发ios时困扰多时游戏开始画面图片的分辨率

  8. Excel的poi缓存问题

    Excel的poi缓存问题 背景: 最近工作需要,需要完成生成新的Excel,然后从Excel中读取包含公式的文本内容. 问题: 当程序中修改公式对应的单元格数据变化时,公式获取的值仍然还是原来的值, ...

  9. Asset Catalog Help (五)---Migrating an iOS App Icon Set or Launch Image Set

    Migrating an iOS App Icon Set or Launch Image Set Simplify image management by moving existing app i ...

  10. Makefile研究(三) —— 实际应用

    转自:http://blog.csdn.net/jundic/article/details/17886637 前面讲了Makefile 的简单语法和简单的应用模板,但在实际项目应用中比这个肯定复杂很 ...