- 博客(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
2787
原创 mysql 后台导入sql文件被kill
现象导入mysql大文件,用了nohup这些命令都不行,当终端关闭老是被kill。解决切换到root用户下 执行nohupsudo -uroot bashnohup mysql -uroot -pxxxxx xxx < xx.sql &
2020-11-19 10:05:52
334
原创 lockfree ringbuffer queue 总结
之前在实现基于共享内存的lockfree ringbuffer queue时候有几点疑惑的地方,做一个总结。本人能力有限,如果有错误的地方,希望能够指出。1.多进程中共享的内存和多线程中看见的内存是否一致?这个问题更多的是linux操作系统的理解,线程和进程其实都是基于clone系统调用生成的KSE,区别在于其共享内存的方式(写时复制)不一样。2.c++的atmoic在共享内存上的操作?首先要保证原子变量分配在共享内存之上,c++的内存模型理论上能够work,建议使用gcc bulitin
2020-09-10 12:23:32
563
原创 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
865
原创 记录一次线上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
703
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
661
原创 高性能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
1278
原创 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
949
原创 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
1249
原创 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
4116
原创 共享内存实现多进程低延迟队列 10us
起因之前的博客写过通过inotify 加文件的形式来实现多进程队列的文章。这种方式在通常情况下表现不错,但是这里存在一个问题就是当消费者过慢,会产生大量的击穿内核高速缓冲区io,导致消费者卡在读取数据的瓶颈上,无法使用负载均衡等手段来提高处理能力。为了解决上述问题,引入了共享内存,众所周知,这是所有ipc中最快的通信方式,从根本上解决这个问题。下面通过实现一个producer 和 consumer 程序,来展示我的设计思路。producer由于物理内存有限,生产者会使用一个环形缓冲区来.
2020-07-02 13:26:05
808
原创 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
370
原创 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
313
原创 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
1060
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
701
4
原创 基于swoole的websocket聊天室设计实现
php中就不能不知道swoole这个扩展了,有了这个扩展很多不可能就变成了可能。借助于swoole提供的websocket机制,实现一个websocket服务器其实非常简单,我们只需要关注如何正确的管理用户链接以及状态。实现要点:使用swoole_table 在进程间共享数据,用来存储房间号中的fd列表。 处理订阅以及取消订阅的时候要加锁。(涉及到fd列表的反序列化)我们一起来看看...
2020-04-17 09:38:44
287
原创 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
450
原创 超简单的分布式任务实现
为什么不用hadoop我们目前的数据大多是时间序列并且有状态的数据,数据体积也在10个g以上,由于时间序列的关系,必须将某一类的数据按照时间顺序严格的绑定在一个map上。并且我们想我们的消费程序完全不需要改造来支持hadoop的map reduce模式。要求:消费者对上游无感。 支持水平扩展。 系统本身耗能(cpu,memory)低。实现:redis用来做任务中心。(rpop...
2020-04-13 10:04:44
306
原创 基于kafka原理单机高性能微秒级别队列改造
为什么不用kafka消息队列kafka是我们日常生活中比较常见的消息队列,非常适合做消息的离线处理。但是在一些实时性要求比较高的场景下,消息自带的延迟是不可忍受的,我测试发现一条消息转发大概需要200ms,实际情况可能有所出入,但肯定是毫秒级别的。我们追求的目标是微秒级别。kafka从设计上就是倾向于面向大众,满足大部分需求。当然满足这些要求的成本就是通过牺牲了性能。所以说kafka适合做...
2020-04-10 15:26:13
333
原创 stdbuf 解决实时输出问题
缓冲类型分为三种:无缓冲 行缓冲 全缓冲stderr默认缓冲就是无缓冲。而stdout的缓冲类型与输出介质有关:屏幕或者终端:行缓冲 重定向文件、管道:全缓冲一般情况下程序输出介质都是屏幕或者终端,采用的都是行缓冲,也就是实时输出。但是当程序输出介质为重定向文件或者管道时,内核为了性能优化,可能变成非实时的。究其原因也就是因为pipe的缓冲区问题。例子:tail -f ...
2019-09-26 12:42:09
4847
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人