首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

C++执行内存memcpy效率测试

在进行memcpy操作时,虽然是内存操作,但是仍然是耗一点点CPU,今天测试了一下单线程中执行memcpy效率,这个结果对于配置TCP epoll中work thread 数量有指导意义。...如下基于8K内存快执行memcpy, 1个线程大约1S能够拷贝500M,如果服务器带宽或网卡到上限是1G,那么网络iowork thread 开2个即可,考虑到消息解析损耗,3个线程足以抗住硬件最高负载...在我到测试机器上到测试结果是: Intel(R) Xeon(R) CPU           E5405  @ 2.00GHz do memcpy speed:12.27 ms/MB each thread...can do memcpy 667.645 MB 1 #include 2 #include 3 #include 4...- start.tv_usec) / (len*loop/1000/1000) ) / loop<<" ms/MB\n"; 24 cout <<"each thread can do memcpy

2.5K40
您找到你想要的搜索结果了吗?
是的
没有找到

3 行代码不应该花一整天时间

原本我打算写一篇关于构建时间文章,但我认为,迭代时间视角能够更准确地切中要害。我将迭代时间定义为看到代码变更按照预期工作所花费时间。 这篇文章目的是帮助你反思当前开发过程。... 3 行代码需要一整天时间 在等待时间里,我可能会随便上网搜点什么,试着想想其他变更,或者看看聊天工具上即时消息。毫无疑问,我注意力可能被分散了,一分钟之后我才想起来去看看编译状态。...而后我需要启动游戏,导航到我正在那个游戏功能,最终可能看到我变更。 我经常负责竞赛逻辑。测试这里变更可能意味着要在职业模式中过上几个赛季,才能测出改了什么。...不开玩笑地说, 3 行代码需要一整天时间,这样才能知道它实际上是否正确运行。 调试工具 我最终转向了较新平台,被安利了一个“试验台”。...我仍然需要偶尔运行完整游戏,但这个测试平台让我能够 快速试验并了解代码是如何运行,从而让我 保持专注。它还使我能够以合理 (以我标准来看) 速度来修复实际问题。

37620

黑科技:魔TProto优化掉100MBLua内存

手机内存优化几乎是所有手机游戏都会做事情。像iphone7,iphone8这样机器,他CPU非常强悍,但是内存一共就只有2G,真正能给应用使用安全内存可能就1.1G左右。...在前面有专门写一篇lua是怎样占用内存: Lua数据内存结构 - 知乎 (zhihu.com) 如果你游戏也是一个用lua开发重度游戏,你可能会观察到其中有个结构TProto占用内存非常夸张,...他内存计算规则如下: 这里可以看到,lua在计算内存时耍了一个小聪明,只是把他认为需要计算部分加了起来,而其中有一个占用内存比较大块字段lineinfo,是没有被计算进内存 我们可以通过注释看到...所以最简单,最暴力做法,就是全局搜索这个字段,把所有用到地方都删掉,因为他只是调试信息不会对正常运行产生任何影响。假如你代码在内存中有200MB,完后你就会发现内存轻轻松松少了100MB。。。...当然用到地方,只需要一处,就是下面加载字节码地方,这个函数在lundump.c中。要把加载进来int转为short,否则是放不下

1.7K20

万字解析:vector类

vector增删查 接口说明 push_back(重点) 尾插 pop_back (重点) 尾删 find 查找。...[] (重点) 像数组一样访问 1.2.5 正确释放 vector 内存( clear()、swap()、shrink_to_fit() ) vec.clear() :清空内容,但是不释放内存。...,pos 位置之后元素会往前搬移,没有导致底层空间改变,理论上讲迭代器不应该会失效,但是:如果 pos 刚好是最后一个元素,删完之后 pos 刚好是end位置,而 end 位置是没有元素,那么pos...是内存二进制格式拷贝,将一段内存空间中内容原封不动拷贝到另外一段内存空间中 如果拷贝是自定义类型元素,memcpy即高效又不会出错,但如果拷贝是自定义类型元素,并且自定义类型元素中涉及到资源管理时...若随着不断地插入,vector会扩容,这个时候新数组空间位置已经变了,但是由于第一个字符串长度大于buf长度,所以第一个字符串是存在堆区,而因为空间位置改变,_ptr 指向位置被销毁了,但是由于是浅拷贝

25420

C++核心准则C.90:依靠构造函数和赋值运算符,而不是内存初始化和内存拷贝‍

C.90: Rely on constructors and assignment operators, not memset and memcpy C.90:依靠构造函数和赋值运算符,而不是内存初始化和内存拷贝‍...No additional initialization, such as by memcpy, should be required....标准C++机制通过调用构造函数构造某个类型实例。正如C.41说明:构造函数应该生成一个完全初始化对象。不应该要求额外初始化,例如使用memcpy。...类型应该提供一个拷贝构造函数和/或者拷贝复制运算符以便适当地生成类拷贝并维持类不变量。使用memcpy拷贝一个非平常可拷贝类型行为没有定义。通常会导致断层或者数据破坏。...提示向memset或memcpy传递非平凡可拷贝类型处理。

95820

C语言——内存函数【memcpy,memmove,memset,memcmp】

一,memcpy 1,基本介绍 我们先看C library对它介绍 重点提取: ①所在头文件:string.h ②函数原型: ●void * memcpy ( void * destination...中2,3,4复制到3,4,5位置,即变成: arr1 [10] = {0,1,2,2,3,4,6,7,8,9} 面对内存有重叠时,我们不使用memcpy,而应该使用memmove...●功能: 从source指向位置开始向后复制num个字节数据到destination指向位置(是不是感觉和memcpy一样) so ●区别: memmove函数可以用来处理源内存块和目标内存块重叠情况...),value(要赋值),num(字节个数) ③函数功能: 将ptr指向内存前num个字节设置成value ④注意: ●这个函数是一个字节一个字节 2,使用实例 假如我们要把hello...(str, 'x', 5); printf(str); return 0; } 输出结果: 假如我们要整型数组: 把arr[5] = {1,2,3,4,5};前2个数字改成0 #include

13410

【C语言】memcpy()函数(内存块拷贝函数)

Network网站上memcpy()函数基本信息: 函数功能 可以看到,memcpy()函数功能是: 从源头指向内存块拷贝固定字节数数据到目标指向内存块....三.模拟实现memcpy()函数功能 实现思路 1.函数参数及返回值设定逻辑 函数参数: void * destination 因为memcpy()函数要实现内存空间拷贝,所以在使用memcpy...让我们再来看一下文章开头时C语言标准对memcpy()函数定义: 也就是说,C标准是不要求memcpy()函数能够拷贝重叠内存,如果我们期望使用可以重叠内存块拷贝函数,那么另一个C标准库函数...综上,在memcpy()函数部分,我将不再深入去探讨内存块重叠情况内存拷贝原理,图示以及模拟实现.而是将这部分内容转移至对memmove()函数详解博客中进行探讨.如果有感兴趣朋友可以移步这篇博客...相关文章推荐 【C语言】rand()函数(如何生成指定范围随机数) 【C语言】memset()函数 【C语言】strlen()函数 【C语言】strcpy()函数 不想bug?

58710

【C语言基础】:内存操作函数

如果这篇文章对你们有帮助的话,别忘了给个免费赞哟~ 一、memcpy函数使用和模拟实现 函数原型: void * memcpy ( void * destination, const void...* source, size_t num ); 内存复制块 将num字节值从源指向位置直接复制到目标指向内存块。...为了避免溢出,目标参数和源参数所指向数组大小应该至少为num字节,并且不应该重叠(对于重叠内存块,memmove是一种更安全方法)。...函数不可以拷贝重叠内存块(虽然也能实现)但不安全,对于重叠内存块,memmove是一种更安全方法。...为了避免溢出,目的参数和源参数所指向数组大小至少为num字节。 memcpy与memmove区别就在于memmove可以复制重叠内存块。

6510

C++从入门到精通(第七篇) :vector深度剖析及模拟实现

,理论上讲迭代 器不应该会失效,但是:如果pos刚好是最后一个元素,删完之后pos刚好是end位置,而end位置是 没有元素,那么pos就失效了。...拷贝问题 假设模拟实现vector中reserve接口中,使用memcpy进行拷贝,以下代码会发生什么问题?...是内存二进制格式拷贝,将一段内存空间中内容原封不动拷贝到另外一段内存空间中 如果拷贝是自定义类型元素,memcpy即高效又不会出错,但如果拷贝是自定义类型元素,并且 自定义类型元素中涉及到资源管理时...,就会出错,因为memcpy拷贝实际是浅拷贝。...比 结论:如果对象中涉及到资源管理时,千万不能使用memcpy进行对象之间拷贝,因为memcpy是 浅拷贝,否则可能会引起内存泄漏甚至程序崩溃。

50320

怎么样才能不写出别人嘴里烂代码

刚入行的人一般都是接触到底层业务开发,而且一般是比较浅显业务需求。编码本身也有金字塔层级,最底端的人用于做着繁杂,混乱,变化莫测业务需求。基本上今天写完明天那种。...在这样前提下,对于一个刚刚接触敲代码行业新人而言,考虑编码规范,设计模式,几乎是不可能。一切以按时完成任务为主要目的。...又一段时间之后,终于代码稳定没啥爆bug地方了,后面的人员看你代码,还是想着,"这写什么玩意,就是一坨翔" 在别人代码与被别人代码挣扎多年 随着时间推移,发际线上升,开始脑袋比较灵光了。...工作中整理了一些习惯,避免自己把代码写成一坨翔: 1)不要犯低级语法错误,尽管不是ERROR级别的错误 这是最基本,学习一门编程语言,不应该在对外项目代码中有语法错。...当代码变成网状结构时候就是灾难爆发时候,动任何一个地方都有可能引爆全部业务。相互引用也会造成内存问题 7)编码规范化,最好是强制格式化指定规范 规范不要靠嘴说!不要靠嘴说!不要靠嘴说!

55920

【如何手写strcpy和memcpy】c++面试常问问题总结01

手写strcpy 2. memcpy实现 3. 断言assert实现 ---- 1....='/0') { *strDest=*strStr; strDest++; strStr++; } *strDest=*strSrc; 注意: 源字符串用const类型,防止在程序中被; 在函数入口处要加上断言...2. memcpy实现 memcpy实现其实可以参考strncpy实现,比如我们把指针类型转换成char*来实现拷贝,这种方式就是按照一个字节一个字节来进行拷贝了,首先还是一睹代码为快,如下: #...,那就要把形参转换成char*类型来操作; 要检查源内存和目标内存是否存在内存重叠,如果目标内存首地址在源内存中间,则要从后往前拷贝,因为如果从前往后拷贝,那从目标内存首地址开始地方就会被覆盖掉,...如果没有重叠,或者源内存地址在目标内存中间,那没有关系,可以从前往后拷贝; 不能使用’\0’来判断拷贝结束,因为它是对一整块内存拷贝,举一个浅显例子,假设拷贝一个结构体,类似上面代码,那么它很可能拷贝到中间某个地方就停止了

47820

【c++】vector以及vector模拟实现

影响size 2.4 vector 增删查 2.5 vector 迭代器失效问题(重点) 迭代器主要作用就是让算法能够不用关心底层数据结构,其底层实际就是一个指针,或者是对指针进行了封装,比如:vector...,理论上讲迭代器不应该会失效,但是:如果pos刚好是最后一个元素,删完之后pos刚好是end位置,而end位置是没有元素,那么pos就失效了。...接口中,使用memcpy进行拷贝,以下代码会发生什么问题?...是内存二进制格式拷贝,将一段内存空间中内容原封不动拷贝到另外一段内存空间中 如果拷贝是自定义类型元素,memcpy既高效又不会出错,但如果拷贝是自定义类型元素,并且自定义类型元素中涉及到资源管理时...,就会出错,因为memcpy拷贝实际是浅拷贝 结论:如果对象中涉及到资源管理时,千万不能使用memcpy进行对象之间拷贝,因为memcpy是浅拷贝,否则可能会引起内存泄漏甚至程序崩溃 3.2 动态二维数组理解

4910

linux下c语言内存检测神器asan,专治各种疑难杂症

最近工作中有地方嵌入式程序出现莫名其妙问题,有时候正常变量值都会突变了导致问题。 这问题还是偶然出现神秘莫测,若没有对内存检测神器,很难定位。...比如char buf[5], memcpy(buf,"12345678",8) ;明显超过了buf范围,但程序竟正常运行不会报错,也没任何提示。...这里明细写出来是为了展现问题,但项目中那么多代码和文件且分散在各处,且有的可能是中间变量拷贝,比如memcpy(buf,buf1,len1),长度len1是变动,比如取自后台应答报文中某个值。...那么这类问题,检查代码也是难看出来。 这也说明对涉及内存操作地方,一定要谨慎,考虑好值合法性问题。 c语言是强大,但是操作太灵活就是怪兽啊,类似这类bug防不胜防。...:一般后台程序为保证稳定性,不能遇到错误就简单退出,而是继续运行,采用该选项支持内存出错之后程序继续运行,需要叠加设置ASAN_OPTIONS=halt_on_error=0才会生效;若未设置此选项,则内存出错即报错退出

4.2K50

【C语言】字符串函数+内存操作函数

void * source, size_t num ); 1.这个函数也没什么可介绍了,他与memcpy唯一不同就是,他可以处理源内存块儿和目标内存块儿重叠情况,函数功能更加健壮 2.所以在拷贝数据发生内存重叠情况时...(arr1, '#', 9);//注意你这里改变了9个字节大小 int arr2[10] = { 0 }; memset(arr2, 1, 10);//注意你这里是数组元素共40个字节中前10...strncpy加上额外功能,而已,我们只要掌握其中重要思想,就可以实现这个函数了 其实这个代码核心思想就是,我们内存拷贝函数是要操作不同类型数据,那么在拷贝时,指针类型就有必要发生改变了,应该用一个可以接收任意地址指针来作为参数...程序会出现错误 12.内存函数memmove模拟实现 12.1C语言标准规定: memcpy只要能够处理不重叠内存拷贝即可 memmove既可以处理不重叠内存拷贝,又可以处理重叠内存拷贝(附加功能实现...这里代码实现我们也还是延续了之前memcpy想法,就是一个字节一个字节拷贝,而且由于src和dest位置大小不同,我们实现代码方式也是不同,所以也要进行if和else分支语句判断 13.内存函数

89920

内核雏形(上) -- 创建属于 kernel 堆栈与 GDT

内存拷贝函数 首先,我们用汇编实现一下供 C 语言调用 memcpy 函数,我们此前文章中曾经写过这个函数: 实战操作系统 loader 编写(下) — 进军内核 [SECTION .text]...* memcpy(void* es:pDest, void* ds:pSrc, int iSize); ; ---------------------------------------------...开辟内存空间存储 kernel GDT 首先,我们需要在拷贝前开辟一段空间来存储新 GDT,那么,开辟多大空间呢,这里我们就需要声明一个段描述符结构。...GDT 复制到新 GDT 中 */ memcpy(&gdt, (void*)(*p_gdt_base), *p_gdt_limit + 1); *p_gdt_limit = GDT_SIZE...extern gdt_ptr sgdt [gdt_ptr] ; cstart() 中将会用到 gdt_ptr call copy_gdt ; 在此函数中改变了gdt_ptr

40820

C语言基础知识总结

cstring) 数组不能直接复制,可利用memcpy函数 void *memcpy(void *dest, void *src, unsigned int count); memcpy 函数用于 把资源内存...(src所指向内存区域) 拷贝到目标内存(dest所指向内存区域);一个size变量控制拷贝字节数; 使用方式memcpy(b,a,sizeof(int)*k) 从a中赋值k个元素到b数组。...memset(结构体/数组名 , "用于替换字符“ , 前n个字符 ); 用法可以参考memcpy,也要用sizeof来计算字节。 总结内存复制需要计算字节。...} 目前接触返回值类型有两种: 有参无返回值:void test(int x,float y){ } 有参有返回值: int max(int x,int y){ return x>y?...三、函数调用 定义:函数名(实参列表); 1)形参变量只有在被调用时才分配内存单元,在调用结束时,即刻释放所分配内存单元。

94020
领券