自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(20)
  • 收藏
  • 关注

原创 c++ double float 相等性判断

起因在c++开发中,double或者float类型判断相等性不能简单的用等于符号进行,一般会采用如下方式进行判断static inline bool DoubleEqual(double a, double b){ return fabs(a - b) < std::numeric_limits<double>::epsilon();}为了验证这个说法,我在机器上写了如下一段代码, 结果竟然没有一次输出,貌似可以直接比较double a = 0, b =

2021-09-16 17:53:11 2631

原创 mysql 后台导入sql文件被kill

现象导入mysql大文件,用了nohup这些命令都不行,当终端关闭老是被kill。解决切换到root用户下 执行nohupsudo -uroot bashnohup mysql -uroot -pxxxxx xxx < xx.sql &

2020-11-19 10:05:52 297

原创 lockfree ringbuffer queue 总结

之前在实现基于共享内存的lockfree ringbuffer queue时候有几点疑惑的地方,做一个总结。本人能力有限,如果有错误的地方,希望能够指出。1.多进程中共享的内存和多线程中看见的内存是否一致?这个问题更多的是linux操作系统的理解,线程和进程其实都是基于clone系统调用生成的KSE,区别在于其共享内存的方式(写时复制)不一样。2.c++的atmoic在共享内存上的操作?首先要保证原子变量分配在共享内存之上,c++的内存模型理论上能够work,建议使用gcc bulitin

2020-09-10 12:23:32 508

原创 js中的forEach 遇到 async await

好久好久没有写js了。。。。,有时候看见这样的代码let ret = [];[xxx].forEach(async (item) => { let res = await xxxx ret.push[res]});//处理ret这样是不对的,forEach底层实现没有await每个回调,所以上面代码其实ret是空的。应该这样写let tasks = [xxx].map((item) => { return Promise});let r

2020-09-02 11:37:44 828

原创 记录一次线上pthread_cond_broadcast引发的性能问题

前言pthread_mutex_lock是在多线程编程中必不可少的一个工具,其底层采用了futex实现,能够在用户态解决大部分的锁竞争,其性能是非常高效的。背景最近上线的一个多进程间消息队列就采用了pthread_mutex_lock和pthread_cond_t来实现pub sub模型。生产者在写入消息的时候,调用pthread_cond_broadcast来唤醒消费者。本来以为这样很完美,在测试环境也没有测出什么问题。然而上线后上游直接报ring buffer full,定位出下游.

2020-08-21 11:18:33 640 1

原创 c++ std::function 比 c function 慢

项目中大量使用functional来替代virtual函数,那么functor函数相对于c function带来的额外成本是多少呢?今天构造一个测试用例来测试下。g++ (GCC) 4.8.5 20150623 (Red Hat 4.8.5-28)测试如下几种情况:1.c functionint _func(int a, int b) { return a + b;}2.重载operator()的structstruct _struct { int operator()(i

2020-07-29 11:39:21 585

原创 高性能c++ string split实现

类似于string_view。测试:分别执行100000次,split耗时257329us, boost::split耗时679503测试得知比boost::split方法大概快2倍。void split(std::vector<std::pair<const char *, size_t>> &a, const std::string &line, const char sep){ const size_t size = line..

2020-07-22 11:39:27 1160

原创 c++ 用 vector 替代map

当数据的key数量线性可控,且有一个不重复的hash 算法来定义key。尝试用vector来替代map 测试下性能#include <sys/time.h>#include <iostream>#include <map>#include <vector>int main(){ // std::map<int, int> test; std::vector<int> test(100, 0); f.

2020-07-21 10:30:13 879

原创 awk 字符串转时间戳

awk 字符串转时间戳 写了很多遍了 记录下function strtotime(str) { fmt=sprintf("%s %s %s %s %s %s %s", substr(str, 0, 4), substr(str, 6, 2), substr(str, 9, 2), substr(str, 12, 2), substr(str, 15, 2), substr(str, 18, 2), substr(str, 21, 2)); return mktime(fmt);}

2020-07-17 16:35:53 1196

原创 pthread mutex cond 进程间共享(PTHREAD_PROCESS_SHARED)性能探究

pthread中提供了pthread_mutex_t互斥锁 和 pthread_cond_t条件变量,我们通常在同一进程不同线程中使用,很少在进程间使用,这次通过实现一个生产者解锁多个阻塞消费者的例子来展示下用法。由于pthread_mutex_t不提供通过名称来在进程间共享的功能,我们通过共享内存的方式来达到共享。注意的是要指定PTHREAD_PROCESS_SHAREDstruct SHM_Data{ pthread_mutex_t mutex; pthread_con.

2020-07-09 16:27:19 3854

原创 共享内存实现多进程低延迟队列 10us

起因之前的博客写过通过inotify 加文件的形式来实现多进程队列的文章。这种方式在通常情况下表现不错,但是这里存在一个问题就是当消费者过慢,会产生大量的击穿内核高速缓冲区io,导致消费者卡在读取数据的瓶颈上,无法使用负载均衡等手段来提高处理能力。为了解决上述问题,引入了共享内存,众所周知,这是所有ipc中最快的通信方式,从根本上解决这个问题。下面通过实现一个producer 和 consumer 程序,来展示我的设计思路。producer由于物理内存有限,生产者会使用一个环形缓冲区来.

2020-07-02 13:26:05 742

原创 struct char[0] 零长数组使用

在c中虽然支持了变长数组,但是在使用的时候还是会有诸多限制。分配在栈上,也就是不能返回变长数组的指针,同时还增加了栈溢出的风险,以下是几种不能使用的场景。不能使用extern声明的长度 在struct members中定义长度 在static变量中定义长度 在函数定义中定义长度extern int n;int A[n]; // invalid: file scope VLAextern int (*p2)[n];

2020-06-03 18:22:44 330

原创 linux inotify 触发点探秘

起因之前写过一篇通过inotify来实现高性能的文件队列的文章,对inotify触发的点有些疑问,到底是底层文件发生变化后才trigger event还是在write complete后才触发的event。有必要搞清楚这个问题。分析查看vfs write相关源码https://github.com/torvalds/linux/blob/master/fs/read_write.cstatic ssize_t __vfs_write(struct file *file, const cha

2020-06-01 11:08:40 273

原创 linux 有名信号量semaphore性能探究

起因最近想基于共享内存加有名信号量实现一个进程间的共享栈,来取代thrift, 优化下ipc的延迟。测试首先测试了下thrift消息传递的延迟,分别在client调用前和server(client server位于同一台机器)收到消息打印微秒start end us776912 777005 93777152 777228 76777340 777422 82777502 777572 70测试结果表明thrift一次通信大概需要80us的延迟。如果我们改为信号量来

2020-05-29 11:15:59 971 1

原创 muduo 中 has_no_destroy 模板

在学些muduo源码中,单例模式源码中有这么一段namespace detail{// This doesn't detect inherited member functions!// http://stackoverflow.com/questions/1966362/sfinae-to-check-for-inherited-member-functionstemplate&l...

2020-04-27 16:28:45 656 4

原创 基于swoole的websocket聊天室设计实现

php中就不能不知道swoole这个扩展了,有了这个扩展很多不可能就变成了可能。借助于swoole提供的websocket机制,实现一个websocket服务器其实非常简单,我们只需要关注如何正确的管理用户链接以及状态。实现要点:使用swoole_table 在进程间共享数据,用来存储房间号中的fd列表。 处理订阅以及取消订阅的时候要加锁。(涉及到fd列表的反序列化)我们一起来看看...

2020-04-17 09:38:44 258

原创 c++ std::enable_shared_from_this 的作用

通常需要使用enable_shared_from_this的场景是我们在类内部通过std::bind生成functor函数传递给其他实例时(暴露了this),当其他实例调用functor函数时,该实例有可能已经被析构,引起异常。在日常c++编程中,为了更好的管理资源,我们通常借助c++的RAII机制实现的shared_ptr来达到对资源的自动管理。class Test{ ...

2020-04-16 11:18:40 394

原创 超简单的分布式任务实现

为什么不用hadoop我们目前的数据大多是时间序列并且有状态的数据,数据体积也在10个g以上,由于时间序列的关系,必须将某一类的数据按照时间顺序严格的绑定在一个map上。并且我们想我们的消费程序完全不需要改造来支持hadoop的map reduce模式。要求:消费者对上游无感。 支持水平扩展。 系统本身耗能(cpu,memory)低。实现:redis用来做任务中心。(rpop...

2020-04-13 10:04:44 275

原创 基于kafka原理单机高性能微秒级别队列改造

为什么不用kafka消息队列kafka是我们日常生活中比较常见的消息队列,非常适合做消息的离线处理。但是在一些实时性要求比较高的场景下,消息自带的延迟是不可忍受的,我测试发现一条消息转发大概需要200ms,实际情况可能有所出入,但肯定是毫秒级别的。我们追求的目标是微秒级别。kafka从设计上就是倾向于面向大众,满足大部分需求。当然满足这些要求的成本就是通过牺牲了性能。所以说kafka适合做...

2020-04-10 15:26:13 295

原创 stdbuf 解决实时输出问题

缓冲类型分为三种:无缓冲 行缓冲 全缓冲stderr默认缓冲就是无缓冲。而stdout的缓冲类型与输出介质有关:屏幕或者终端:行缓冲 重定向文件、管道:全缓冲一般情况下程序输出介质都是屏幕或者终端,采用的都是行缓冲,也就是实时输出。但是当程序输出介质为重定向文件或者管道时,内核为了性能优化,可能变成非实时的。究其原因也就是因为pipe的缓冲区问题。例子:tail -f ...

2019-09-26 12:42:09 4709

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除