
技术
文章平均质量分 50
superzmy凄临雨
某小公司技术总监,主导了基于Bolt界面引擎的某增强界面引擎,指导重写了一个PC客户端、经历了3D游戏开发及3D地图编辑器开发、擅长框架及各种C++轮子的设计与开发
展开
-
一句话区别不同排序
选择:从未排序数据中找到应当放在第I位置的数据,放入第I位置(通过交换二者)。插入:从未排序数据中第一个,插入到已排序数据快排:区间中取一个标准,随后每个元素大于的放右游标处(然后游标左移),小于的放左游标处(然后游标右移);随后分别对左~左游标,右游标-右,进行递归调用。归并:非原地归并需要O(N)空间,原地归并时间复杂度O((logN)²N )希尔:将数组,元素下标除以delta按余数...原创 2020-05-01 22:58:30 · 241 阅读 · 0 评论 -
纪录|多写单读并发流与cameron、tbb并发队列性能对比
我的作品ConcurrencyWriteStream,提供多线程写单线程读+多线程探测有无数据的功能,其元素不定长,可用于直接存储多类型lambda作为异步任务调度核心。cameron似乎是目前网络上最优化的并发队列,提供了多(线程)写多读并发功能,其元素为泛型T。tbb的concurrent_queue与其类似。boost的并发队列各方面性能都不如tbb,因此性能数据不列出。(以下单位均...原创 2019-10-02 12:22:07 · 817 阅读 · 0 评论 -
游戏排行榜最优算法-字典树。与超快速跳表、redis跳表性能对比。
如果使用数据库,毫无疑问redis的有序集合(基于跳表)是最简单的一般来讲很多文章也会推荐跳表skiplist但是由于战力可转化为整数数值存储,论本地内存计算的数据结构,当属字典树最优标准树容器都不支持容器内节点的字典序的距离差计算,但其实自己改造树是可以的实现的:每个分支记录分支下元素总数,每当有元素插入删除时,更新其所有祖先上的数量记录,用时O(层数)=O(log(N))(4、8、16...原创 2019-09-30 15:29:21 · 1168 阅读 · 0 评论 -
小内存复制提速: 防止编译为memcpy
C++编译循环复制代码,经常被编译成memcpy,可能导致降低速度原创 2024-11-26 13:52:02 · 146 阅读 · 0 评论 -
【原创总结】字符串复制写法
strcpy strncpy strlcpy memccpy 等字符串复制函数的总结原创 2022-02-16 21:48:36 · 302 阅读 · 0 评论 -
在gcc编译器上谨记加上-fwrapv防止编译器不考虑整数环绕
#include <stdint.h>#include <utility>#include <stdio.h>#include <stdlib.h>int calc_hash(signed char *s){ static const int N = 100003; int ret = 1; while (*s) { ret = (ret * 131 + *s); ++ s;原创 2021-04-16 03:08:37 · 855 阅读 · 1 评论 -
基于多继承的Tuple
多继承Tuple(加快编译速度),实现按序号Get成员,按序号得到成员类型Type#include <stdint.h>#include <utility>namespace NTuple{template<typename T, std::size_t index>struct Elem;template<std::size_t index, typename T>T& Get(Elem<T, index>&原创 2021-03-30 21:40:04 · 196 阅读 · 0 评论 -
强制noinline地调用目标函数 O2/3 兼容gcc clang msvc icc
#ifdef __clang__#define CallNoInline(f) (decltype(&f) ((intptr_t)f - 1 + 1))#elif defined(_MSC_VER)#define CallNoInline(f) (decltype(&f) ((intptr_t)f - 1 + 1))#elif defined(__ICC)template<typename T> auto ____get(T* p) { return p;}#defi原创 2021-01-01 11:08:18 · 377 阅读 · 0 评论 -
快速评估2D整数坐标距离【3次加强版】
参见http://blog.sina.com.cn/s/blog_476a25110100maem.html在其基础上int FastDistance2D(int x, int y){x = abs(x);y = abs(y);int mn = min(x, y);return(x + y - (mn >> 1) - (mn >> 2) + (mn >> 4));}// min(x, y) 应小于intmax / 11,否则会出错int FastDi原创 2020-05-19 06:12:32 · 374 阅读 · 0 评论 -
C# Log2和popcount内部实现
/// <summary> /// Returns the integer (floor) log of the specified value, base 2. /// Note that by convention, input value 0 returns 0 since Log(0) is undefined. ...转载 2020-03-30 16:58:26 · 461 阅读 · 0 评论 -
redis不采用红黑树而采用了跳表skiplist的【真正】原因
唯一原因:代码简单,c语言里要实现一个类似c++里的std::multimap必须付出巨大的努力,redis的作者可懒得写就用了代码简单的跳表。一小部分优势:从已查找到的起点开始顺序遍历的性能略微高于红黑树其他答案经常说redis的跳表有什么性能优势,不存在的,redis跳表实现的性能非常差,增删改查性能都比VisualStudio的红黑树差了4~5倍,只有从已知某个起点顺序遍历理论上会好一些...原创 2019-11-14 08:00:50 · 1334 阅读 · 3 评论 -
Windows Linux 与Fushsia的粗略对比
从操作系统的设计理念感觉Fuchsia可以成为21世纪的主流操作系统主题WindowsLinuxFushsia一切皆?ObjectFileObject内核偏微内核偏宏内核(偏)微内核事件同步对象Event,需要主动使用signal,被动调用函数结合的Object Signal模型不支持signal及可直接实现它的机制安全Object属...原创 2019-11-10 06:53:33 · 302 阅读 · 1 评论 -
弱一致性cpu两个线程间传递new的对象的可见性问题
已知A线程:设置a,再设置pA = &aB线程:等待pA有效后,再对* pA访问在x86下可以保证B线程取得a的最新值,但其他更弱一致性的cpu(arm,powerpc)无这种保证,几乎是会出错的。上面还是比较容易理解的但是如果延伸一步:A线程:pA = new {5}B线程:等待pA有效后,再对*pA访问在弱一致性cpu上是否能保证正确呢?对pA的赋值是否应当使用atom...原创 2019-11-07 13:00:25 · 208 阅读 · 1 评论 -
【超越条件变量】多生产者,单消费者,最节约唤醒API调用的方案。2020-5-29升级版。
三态解决生产者 唤醒 消费者的系统调用消耗消费者:生产者:准备数据放入队列Test:cas(空闲态→工作态) 并判断原状态工作态:OK,消费者本来就在工作态,所以数据必将被处理检查态:消费者可能已经在Check之前或之后,此时应当堵塞直到脱离检查态以后再跳转到 Test重试。a) (进一步优化使多个生产者只有一个堵塞)。b) (进一步优化加多检查态1、2、3……使得生产者堵塞...原创 2019-10-22 19:52:13 · 367 阅读 · 0 评论 -
c++泛型库罕见编写注意事项
由于operator,逗号运算符 重载存在,泛型库对于 if ( A(), 123) 这样的逗号连接表达式应在中间插入(void),如 A(), (void), 213。由于operator& 取址运算符 重载存在,泛型库应使用std::addressof取地址...原创 2019-10-19 18:09:10 · 184 阅读 · 0 评论 -
VS内存泄漏检测手工代码
手工版泄露检测,用法,平时用d_new替换普通new的均会被检测,注意placement new不要替换性能:每次d_new和任何delete都要查表,估计是很慢的。强类型调试器可随时查看输出可以跳转到源码(补充代码可以实现快照对比,只需要复制和STL集合运算即可)(理论上可以一个类型一个map,这里先不实现了)限制:用了static inline变量,需要C++17,(理论上可以...原创 2019-10-19 17:38:29 · 334 阅读 · 0 评论 -
缓存着色 Page color测试
根据7个示例科普CPU CACHE测试缓存着色E3 1230v2, L2缓存:4256KB 8way (1MB)cacheline 64B,页大小64KB,1页含有1024cacheline。set数量=1MB/64/8=2048.根据文中所述,2KB64=128K,(理解不够深,不晓得算对没有)每128K的物理内存会映射到同一个cache slot上竞争,这个slot容量是8....原创 2019-10-18 23:57:20 · 769 阅读 · 0 评论 -
[C++17] 判定类型能否执行指定表达式
template<typename A, typename B, typename = void> struct is_equal_comparable : std::false_type {}; template<typename A, typename B> struct is_equal_comparable<A, B, ...原创 2019-10-18 20:34:39 · 174 阅读 · 0 评论 -
SQL插入100万个自然数
SQL插入100万个自然数到表(id为主键)方案一with Result as(select aaa.col*100000+ aa.col*10000+ a.col*1000+b.col*100+c.col*10+d.col+1 as colfrom (select 0 as col union all select 1 union all select 2 union all sel...原创 2019-10-17 17:09:12 · 609 阅读 · 0 评论 -
MSVC里__forceinline的真正作用
MSVC里__forceinline的真正作用:如果这个函数能在O2下是内联的,那么在O1优化下将原本调用方式的代码转换成内联的debug下依然无效原创 2016-03-05 18:21:25 · 1729 阅读 · 0 评论 -
lua gc 优化方案
此文章至少适合lua5.1在我的项目中,变量增减多了,就会在某轮lua gc中可能会大量调用alloc函数(特别指free,可以高达8万次当发生gc的时候,这将占用几十、几百毫秒的时间)造成cpu曲线不平滑,很容易给人卡顿的感觉解决方案有两种,一种是云风给出的多线程gc还有一种则是我正在用的,在不能修改lua引擎代码的情况(比如使用Bolt界面引擎)能很好发挥作用的方案:我称此原创 2015-05-11 18:01:42 · 5521 阅读 · 0 评论 -
[C++11] 对不同类别不定参数的ForEach
本文实现以下功能,在VS2013上编译通过 struct MyProcesser{ template static // inline void process(const T& t) {// std::cout }};int _tmain(int argc, _TCHAR* argv[]){ TupleForEach::foreach(st原创 2014-07-12 02:57:47 · 2006 阅读 · 0 评论 -
[C++]为什么我不用shared_ptr管理网络连接
为什么我不用shared_ptr管理网络连接:原创 2014-07-12 14:42:01 · 932 阅读 · 0 评论 -
[c++] 判断类下是否有某个指定类型及名称的字段
#include "stdafx.h"#include #include templatestruct IndexedTWrap{ typedef T type; static T gettype(); enum{ Index = _Index };};struct _GetClass_HasMember{ template原创 2014-07-18 09:46:45 · 2037 阅读 · 0 评论 -
[c++11] 判断 类内是否有指定名字的 字段/成员函数/静态函数/typedef
#include "stdafx.h"#include #include template::value >::type>short existFirst(){}templatechar existFirst(...){}template::value >::type>short exist_c_str(){}templa原创 2014-07-18 10:37:27 · 1916 阅读 · 0 评论 -
[c++11] 判断类内是否有typedef某个名字的类型成员
#include "stdafx.h"#include #include templatestruct IndexedTWrap{ typedef T type; static T gettype(); enum{ Index = _Index };};struct _GetClass_TypeOrTHelper{ template st原创 2014-07-18 08:04:52 · 3541 阅读 · 0 评论 -
[c++11] 判断某类是否有某个原型及名称的成员函数
#include "stdafx.h"#include #include templatestruct IndexedTWrap{ typedef T type; static T gettype(); enum{ Index = _Index };};struct _GetClass_HasMember{ template st原创 2014-07-18 08:47:24 · 1803 阅读 · 0 评论 -
【并行算法】将一个4字节的整数的二进制表示中的001替换为011
使用并行算法 位运算 解决 4字节整数里的片段替换原创 2013-10-31 16:41:54 · 3279 阅读 · 0 评论 -
xmemcpy改进版
xmemcpy改进版,利用movdqu速度快的特点,利用内联和常量化来提高对于小内存的memcpy性能优化xmemcpy来自github beyondszine/progs/C/c_progs/memcpy.c ,不知道是不是原作者,这里进行了部分改进预期结果:All time to memcpy 80 * 100M is 0.248s in 3GHz (xmemcopy)A原创 2016-02-26 18:01:23 · 3979 阅读 · 0 评论 -
z memcpy(for MSVC)小内存高速复制
z memcpy(for MSVC only)小内存高速复制,即使在debug模式下复制的也比memcpy快原创 2016-03-05 20:19:23 · 2450 阅读 · 2 评论 -
解决unique_ptr在不同继承层次转化指针和deleter的问题
unique_ptr在多继承层次使用时,如果使用不当,容易出现B* p = new D(); delete p;的问题因此这里提出一个UniquePtr旨在正确处理析构。当然你需要付出一点小小的性能代价原创 2017-05-16 16:56:30 · 3569 阅读 · 0 评论 -
C++表达式值分类(左右值等)
prvalue = 纯右值 = (C++17) “初始化”prvalue----temporary materialization conversion 临时物化------>glvaluelvalue = 左值=有身份,不能被移动rvalue = 右值=能被移动glvalue = 广义左值=有身份的xvalue = 混合=有身份,也能被移动...原创 2019-10-05 07:14:47 · 670 阅读 · 0 评论 -
VS2019中使用char8_t编程后,代码兼容2017的方法
介绍:由于VS2019中启用了char8_t,decltype(u8"字符串") 是 const char8_t(&)[ N ],导致许多代码需要变更。然而一旦变更后,回到VS2017中反而会因为重载和模板匹配的问题导致错误,这就需要一些兼容机制来处理移植问题。一个是https://github.com/tahonermann/char8_t-remediation。用法不太清楚。...原创 2019-10-04 06:12:54 · 2078 阅读 · 0 评论 -
我所理解的数据驱动
这里讲的数据驱动指的是程序开发或工作流程等领域的。数据驱动似乎不是一个大众统一认识(像过程式开发那样)的名词,也许不同人有不同理解,我是这么理解的:数据驱动:当需要完成一个任务,完成任务的的方法是修改一些数据,这些数据的修改将会触发一系列链式反应(可能会修改其他数据),直到任务完成。界面开发中的MVVM就是数据驱动。事件驱动:当需要完成一个任务时,调用一些函数或方法,导致其他对象所监视的事件...原创 2019-03-30 08:45:03 · 1048 阅读 · 0 评论 -
VS 可替换弱符号 转自stackflow(没试验过)
一般情况 __declspec(selectany) 够用,在需要符号替换的时候,参考下面的Visual Studio中的GCC样式弱链接?/* * pWeakValue MUST be an extern const variable, which will be aliased to * pDefaultWeakValue if no real user definition is p...转载 2019-03-20 00:38:04 · 423 阅读 · 0 评论 -
按看电影次数的最多的前n个用户问题,极限性能解答
有一个5000万的用户文件,一个2亿记录的用户看电影记录,列出前1000/1000万个看电影次数最多的用户。本答案比更通用更有扩展性的答案麻烦很多倍,但是性能应该也能强个几倍。分析:用户有50M个(显然不重复,我们关心用户名或UUID,总之是个超过int32的数据类型),记录有200M个(每行记录我们只关心是哪个用户),任务的最后一个步奏是不断的得出某个用户的总观影次数,配合最小堆,即可...原创 2019-03-14 16:26:24 · 827 阅读 · 0 评论 -
[C++]直接访问float变量内存的类,addEpison和subEpison、almostEqual约等于,及浮点数排序函数。从此忘记0.000001 再也不要使用FLT_EPSILON!
探究浮点数奥秘,这里给出一个直接访问float变量内存的类,二进制兼容float, 并给出addEpison和subEpison两个函数 而这两个函数,是模糊比较所需要的方法的基础。//负数时随着内存值int变大,浮点值绝对值越大// 80000000 →→→ bf800000 → ff7fffff ff800000 ff800001 ffffffff// -0 ...原创 2018-05-03 09:26:46 · 562 阅读 · 0 评论 -
float内存值定义域与浮点值对应表
float内存存储采用IEEE754,小端机器上可用此结构体访问……将为了查看整个float内存值定义域及对应浮点值,给人留下直观的印象,这里编写代码如下……以下将内存值的各个范围和浮点值打印输出如下原创 2018-05-03 08:08:51 · 1137 阅读 · 0 评论 -
1G内存2G文件找出现最多次QQ号算法
题目:服务器内存1G,有一个2G的文件,里面每行存着一个QQ号(5-10位数),怎么最快找出出现过最多次的QQ号看来网上不少交流,发现大家都觉得1G内存放不下上面的数据其实是可以放得下的,只要700M左右就可以在内存里放下这些数据,不需要外排 完全不需要写硬盘,位图+分区思想可以在内存把334M行10位数QQ号完成统计 详解: 9999999999 = 0x2540BE3FF原创 2013-10-31 14:29:12 · 4024 阅读 · 6 评论