【性能】单例模式与指针直接使用方式对比

在写代码时,往往为了使用方便,将一些接口类设计为单例模式。

如果能够理清类之间的创建关系,最好将对象的指针传入要使用的对象中。

以下为同一台机器上进行的多次性能测试,性能差别还是比较明显的。

#include <stdlib.h>
#include <stdio.h>class A
{
public:A() = default;~A() = default;static A& get_instance(){static A my_intance;return my_intance;};void func(){printf("print func\n");}
};int main()
{// A a;int count = 1000000000;while (count-- > 0){A::get_instance().func();// a.func();}return 0;
}

测试结果:

单例模式测试结果

real    0m16.725s
user    0m16.540s
sys     0m0.180sreal    0m16.737s
user    0m16.561s
sys     0m0.170sreal    0m16.849s
user    0m16.684s
sys     0m0.160sreal    0m16.850s
user    0m16.686s
sys     0m0.160sreal    0m16.832s
user    0m16.667s
sys     0m0.160s

通过指针传递引用方式测试结果

real    0m15.821s
user    0m15.608s
sys     0m0.210sreal    0m15.932s
user    0m15.806s
sys     0m0.120sreal    0m16.218s
user    0m16.043s
sys     0m0.170sreal    0m16.061s
user    0m15.877s
sys     0m0.180sreal    0m16.008s
user    0m15.833s
sys     0m0.170s

10亿次输出单条log,性能差距将近10%

=======================

将上述创建A对象的方式用shared_ptr的方式,这效率能与原始指针的方式差距更大,约20%
测试程序:
 

#include <stdlib.h>
#include <stdio.h>
#include <memory>class A
{
public:A() = default;~A() = default;static A& get_instance(){static A my_intance;return my_intance;};void func(){printf("print func\n");}
};int main()
{auto p = std::make_shared<A>();int count = 1000000000;while (count-- > 0){// A::get_instance().func();// a.func();p->func();}return 0;
}

测试结果: 

real    0m20.193s
user    0m19.970s
sys     0m0.220sreal    0m19.380s
user    0m19.207s
sys     0m0.160sreal    0m19.389s
user    0m19.215s
sys     0m0.170s

如果存在shared_ptr赋值给weak_ptr,在weak_ptr使用时,追加 expired判断 和 转换为shared_ptr,效率就低的更可怕。

部分程序(类A没有变动):
 


int main()
{auto p = std::make_shared<A>();std::weak_ptr<A> w_p = p;int count = 1000000000;while (count-- > 0){// A::get_instance().func();// a.func();if(!w_p.expired()){std::shared_ptr<A> sp = w_p.lock();sp->func();}}return 0;
}

测试结果:

real    1m2.789s
user    1m2.611s
sys     0m0.170sreal    1m2.371s
user    1m2.043s
sys     0m0.320sreal    1m3.127s
user    1m2.939s
sys     0m0.181s

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/647433.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

OpenHarmony—TypeScript到ArkTS约束说明

对象的属性名必须是合法的标识符 规则&#xff1a;arkts-identifiers-as-prop-names 级别&#xff1a;错误 在ArkTS中&#xff0c;对象的属性名不能为数字或字符串。通过属性名访问类的属性&#xff0c;通过数值索引访问数组元素。 TypeScript var x { name: x, 2: 3 };c…

WWDG喂狗

3F 是0111111 40 是1000000 0X7F 127 0X5F 95 127-9532 注意:中断是在0x40,在0x40喂狗则程序不会复位 在0x5F之前喂狗会复位,减小到63以下也会复位 在0x5F与0x3F之间喂狗会继续执行,不会复位 WWDG_HandleTypeDef WWDG_Handler; //窗口看门狗句柄//初始化窗口看门狗…

项目解决方案:非执法视频监控系统项目设计方案

目 录 一、概述 &#xff08;一&#xff09;前言 &#xff08;二&#xff09;设计思路 &#xff08;三&#xff09;设计原则 1、实用性 2、可靠性 3、安全性 4、先进性 5、开放性 6、易管理、易维护 &#xff08;四&#xff09;设计依据 二、方案总…

【MySQL】阿里云服务器卸载MySQL流程

使用该命令查询当前安装的MySQL rpm -qa | grep mysql使用rpm -ev接上相应名称删除这些项目&#xff0c;推荐从下往上逐个卸载 接下来使用find / -name mysql查询系统内剩余的MySQL文件 最后使用rm -rf接对应文件目录删除 收尾再次使用find / -name mysql查询&#xff0c;No…

android 相机预览数据两个 GL_TEXTURE_EXTERNAL_OESS和GL_TEXTURE_2D类型的数据应用场景,以及同时渲染的原因和关系

相机哪些功能可用GL_TEXTURE_2D类型的数据渲染&#xff1f; 在Android的相机预览中&#xff0c;可以使用GL_TEXTURE_2D类型的数据来渲染以下功能&#xff1a; 界面元素&#xff1a;应用程序可以使用GL_TEXTURE_2D类型的纹理来渲染界面元素&#xff0c;例如按钮、文本框、标签…

关于鸿蒙系统开源和技术细节的一些探讨

1月18日在深圳举办了“鸿蒙生态千帆启航仪式”&#xff0c;这也是华为鸿蒙开启生态进阶的信号。在政策的叠加下&#xff0c;鸿蒙未来必定是势不可挡的。我们这些程序员也得与时俱进&#xff0c;熟悉鸿蒙的技术和细节&#xff0c;别在经济寒冬里被淘汰了。 官方称 Harmony OS N…

HarmonyOS鸿蒙学习笔记(23)监听Wifi状态变化

监听Wifi状态变化 前言创建接收状态变化的Bean对象创建订阅者和订阅事件参考资料&#xff1a; 前言 本篇博文通过动态订阅公共事件来说明怎么使用HarmonyOS监听Wifi状态的变化。关于动态订阅公共事件的概念&#xff0c;官网有详细说明&#xff0c;再次就不在赘述。博文相关项目…

[GDMEC-无人机遥感研究小组]无人机遥感小组-000-数据集制备

基于labelme的无人机语义分割数据集制备 文章目录 基于labelme的无人机语义分割数据集制备1. 数据获取2. 安装labelme3.利用labelme进行标注 1. 数据获取 数据集制备需要利用无人机飞行并采集标注。使用录制模式&#xff0c;镜头垂直向下进行拍摄&#xff0c;得到DJI_XXXX.MP4…

研发日记,Matlab/Simulink避坑指南(四)——transpose()转置函数Bug

文章目录 前言 背景介绍 问题描述 分析排查 解决方案 总结 前言 见《研发日记&#xff0c;Matlab/Simulink避坑指南&#xff08;一&#xff09;——Data Store Memory模块执行时序Bug》 见《研发日记&#xff0c;Matlab/Simulink避坑指南(二)——非对称数据溢出Bug》 见《…

32人联机自建服务器攻略【幻兽帕鲁多人游玩】

创建幻兽帕鲁服务器1分钟部署教程&#xff0c;阿里云和腾讯云均推出幻兽帕鲁服务器服务器和部署教程&#xff0c;4核16G和4核32G配置可选&#xff0c;阿腾云atengyun.com分享1分钟自建幻兽帕鲁Palworld服务器教程&#xff1a; 幻兽帕鲁服务器创建教程 幻兽帕鲁服务器官方推荐…

使用 Redis 的 List 数据结构实现分页查询的思路

假设有一个存储数据的 List&#xff0c;每个元素代表一个记录&#xff0c;例如 recordsList。 按页存储数据&#xff1a; 每页存储一定数量的记录。例如&#xff0c;第一页存储索引 0 到 N-1 的记录&#xff0c;第二页存储索引 N 到 2N-1 的记录&#xff0c;以此类推。 分页查…

书生·浦语大模型--第六节课笔记作业--OpenCompass大模型评测

文章目录 OpenCompass评测框架实战&基础作业安装查看支持的数据集和模型启动评测 为什么需要评测&#xff1f; 统一的模型评测 如何评测&#xff1f; 基座模型需要加上额外的提示 客观评测&#xff1a;只要回答包括北京就可以认为正确 主观评测&#xff1a;创作类问题。人工…

golang视角下 protobuf 的安装 从proto文件到go文件

Protocol Buffers&#xff08;protobuf&#xff09;是一种由Google开发的轻量级、高效的数据序列化格式。它设计的目的是为了在不同系统之间进行数据交换&#xff0c;同时保持数据的结构化和高效传输。以下是一些关键特点&#xff1a; 二进制格式&#xff1a; Protobuf 使用二…

设计模式_访问者模式_Visitor

案例引入 要求 测评系统需求&#xff1a;将观众分为男人和女人&#xff0c;对歌手进行测评&#xff0c;当看完某个歌手表演后&#xff0c;得到他们对该歌手不同的评价(比如 成功、失败 等) 传统方案 Man和Woman里面都有“成功”、“失败”的方法 【分析】 如果系统比较小&…

springboot优雅停机

import org.springframework.context.annotation.Configuration;import javax.annotation.PreDestroy;Configuration public class DataBackupConfig {PreDestroypublic void backData(){System.out.println("开始备份..."System.currentTimeMillis());System.out.pr…

6.Toast(Android)

愿你出走半生,归来仍是少年&#xff01; 环境&#xff1a;.NET 7、MAUI 在Maui开发中使用的Toast太丑了&#xff0c;在android项目中使用时不够看。通过Maui的安卓绑定库可实现将android中已有的包导入到C#项目中使用&#xff0c;借助这个方法就可以使用以前在android原生开发…

Python_NumPy——入门学习(概述,数据类型,创建数组)

作者&#xff1a;初次知晓 邮箱&#xff1a;lr_1052107892outlook.com 资料参考 [菜鸟教程](https://www.runoob.com/)NumPy概述 NumPy(Numerical Python)是python的一个扩展程序库&#xff0c;支持大量的维度数据与矩阵运算&#xff0c;针对数据运算提供大量的数学函数库,包…

如何降低微服务复杂度丨云栖大会微服务主题分享实录

作者&#xff1a;谢吉宝 本文整理自阿里云资深技术专家、中间件负责人谢吉宝在2023云栖大会《极简微服务模式&#xff0c;降低微服务复杂度的最佳实践》的分享 2023 云栖大会现场 当面临复杂的挑战时&#xff0c;"分而治之"的方法往往能取得显著的效果。微服务架构…

C++——类型转换与特殊类设计

我们在C语言中经常会使用到强制类型转换&#xff0c;例如指针和整形之间的转换是最为常见的&#xff0c;但是 在C中&#xff0c;C设计师认为这种强制类型转换是不安全的&#xff0c;所以在C标准中加入了四种强制 类型转换风格&#xff0c;这就是我将要介绍的强制类型转换。 在某…

Stable Diffusion 长视频真人动画风格互转

Stable Diffusion Temporal-Kit和EbSynth 从娱乐到商用 1. Temporal Kit 和 EbSynth1.1 提取关键帧1.2 关键帧风格迁移1.3 生成序列帧2. 真人转卡通3. 卡通转真人4. 编辑技巧5. ControlNet + TemporalNet + 达芬奇Fusion6. Rerender A Video7. DiffSynth-Studio基于SD的风格化…