自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(16)
  • 资源 (3)
  • 收藏
  • 关注

原创 erlang sets 性能分析

有个业务需要大量存取增删非重复数据,原实现逻辑是使用set的数据结构。set结构本质上是用erlang实现的,对数据哈希后结合tuple和list的一层包装,set出生在erlang还没有maps结构时的早期版本,用以比单独的list结构更高效的解决集合问题。maps结构出现后,能否高效的替代掉set呢?下面做一些对比:增操作:时间消耗差了一个数量级查操作:删操作:耗时方面,maps全面碾压set。但maps也有缺点,在空间占用上:maps方式占用空间略大的原因是多存储了null这个值

2022-05-27 11:36:05 286

原创 erlang ets源码实现浅析

新建ets时默认配置为:[set, protected, {keypos,1}, {heir,none}, {write_concurrency,false}, {read_concurrency,false}, {decentralized_counters,false}]先看ets:new时会发生什么,即源码 erl_db.c 中 ets_new_2 函数核心实现为:DbTable* tb = NULL; //ets表底层存储数据的结构meth = &db_hash; //注, 设

2021-08-28 23:00:07 741

原创 erlang on_heap off_heap 源码剖析

进行消息发送时主要有以下过程:1.计算消息大小2.分配能容纳整个消息的空间3.复制消息负载4.分配消息容器的元数据5.在接收者进程的消息队列中插入消息容器接收方进程的message_queue_data进程标志控制着步骤2中发送方消息的分配策略以及决定了后续垃圾回收时如何处理消息数据。我们可以使用 process_flag(message_queue_data, off_heap | on_heap) 为每个进程配置不同的消息占用空间的行为,或者可以在启动时使用选项 +hmqd 为所有进程进行

2021-07-30 11:41:17 328

原创 rebar3 自定义编译插件攻略

插件任务:在用户执行rebar3 compile时,自动运行插件自定义的逻辑。增加钩子:在顶层目录的rebar3.config中增加配置(provider hooks的写法){provider_hooks, [ {pre, [{compile, {auto_config, compile}}]}]}.意为 rebar3 compile命令前,自动执行 rebar3 auto_config compile 指令或者 shell hooks 的写法:{pre_hooks, [“

2021-06-17 15:38:10 566

原创 mongo协议处理流程 && mongo-erl驱动批量upsert

mongo源码版本 4.4.6service_entry_point_common.cpp 中有DbResponse ServiceEntryPointCommon::handleRequest( OperationContext* opCtx, const Message& m, con

2021-05-21 15:09:47 416

原创 erlang 热更卡死之谜

案发现场:想让一业务繁忙的进程多被调度,于是在该进程启动时调用process_flag(priority, high)提高进程优先级。之后便出现热更卡死的情况。刑侦知识:热更部分:当我们使用c(被热更模块名),进行热更时,实际上是把热更任务丢给了系统启动的名为erts_code_purger的进程。erts_code_purger.erl中找到do_soft_purge的函数实现,有如下调用 {PurgeOp, NewReqs} = check_proc_code(erlang:processes

2021-04-29 11:33:54 527

原创 erlang gc模拟器——直观理解gc规则

-module(gc_simulation).-compile(export_all).-record(memory_data, { heap_stack = 0, heap = 0, stack = 0, high_water = 0, old_heap = 0, old_heap_max = 0, %% 标记过期数据 heap_garbage = 0}).heap_size() -> ListA = lists:foldl(fun(_, [H1, H2|Acc])

2021-04-15 17:13:51 1245

原创 erlang尾递归更快么?

我们先看两段递归实现:尾递归和其对应的汇编码:tail_rec(_, [], Acc) -> lists:reverse(Acc); tail_rec(F, [H|T], Acc) -> tail_rec(F, T, [F(H)|Acc]). //注:虽然 beam_emu.c 中有 #define y(N) E[N]。 E[0]为进程空间的栈顶 //但是加载器在加载到 {y,Y}时,会将Y加1。也就是说我们看汇编码中的Y(N),实际对应的地址为E[N+1] {label,4}.

2021-04-13 14:41:08 829

原创 erlang catch和try 底层实现剖析

跟try有关的外部通用指令有四条,分别是{"try", 2, -1, 0, 7521}, //特定指令id为-1,指令转换操作的地址偏移为7521{"try_end", 1, 461, 1, -1}, //对应特定指令id为461 {"try_case", 1, 459, 1, -1}, //对应特定指令id为459 {"try_case_end", 1, 460, 1, -1}, //对应特定指令id为460我们发现try指令对应的特定指令为-1,也就是说try指令不是直接转换为特殊指令的,而是

2021-04-08 14:33:56 1080

原创 erlang编译系列之流程概括

我们从compile:file/1函数入手,先梳理下编译的流程。下面是抽丝剥茧后一些核心的代码:file(File) -> file(File, [verbose,report_errors,report_warnings]). //file会调用到internal({file,File}, Opts) -> {Ext,Ps} = passes(file, Opts), // 一些列的操作列表 Compile = #compile{options=Opts,mod_optio

2021-03-25 00:13:04 1130

原创 Erlang进程字典底层实现剖析

进程字典的结构:typedef struct proc_dict { unsigned int sizeMask; // 掩码,用于计算hash值落到data的索引值 unsigned int usedSlots; // 可以使用的插槽数(不等于已经被使用的插槽数) unsigned int arraySize; // data数组的长度 unsigned int splitPosition; Uint numElements; //

2021-01-13 16:04:43 1335

原创 Erlang数据类型底层实现剖析 三

这回我们看 hashmap_from_validated_list(BIF_P, BIF_ARG_1, size)的实现static Eterm hashmap_from_validated_list(Process *p, Eterm list, Uint size) { while(is_list(item)) { res = CAR(list_val(item)); kv = tuple_val(res); hx = hashmap_res

2020-12-15 17:40:58 1104

原创 Erlang数据类型底层实现剖析 二

tuple实现:我们从erlang:make_tuple/2的底层实现来看看tuple的组织:erlang:make_tuple(4, []).{[],[],[],[]}BIF_RETTYPE make_tuple_2(BIF_ALIST_2){ Sint n; Eterm* hp; Eterm res; if (is_not_small(BIF_ARG_1) || (n = signed_val(BIF_ARG_1)) < 0 || n > ERT

2020-11-06 17:39:42 1008

原创 Erlang数据类型底层实现剖析 一

Erlang中所有数据类型,在Erlang虚拟机中都是通过64位的(默认大家都是64位的操作系统)名为Eterm的数值组合(一个或多个Eterm)构成的。虚拟机会使用Eterm的某几位来标记这个Eterm是什么类型(这几位又叫标签,Tag),再根据Tag的不同,对Eterm进行不同的解释。下面列出所有Tag的定义,并进行简单的注解#define _TAG_PRIMARY_SIZE 2 一等Tag的位数 注:Tag有分等级,一等Tag有四类#define _TAG_PRIMARY_MASK

2020-08-18 14:30:57 1287

原创 erlang garbage_collect 源码剖析

两个词可以概括整个gc流程:分代:数据存储区域分为年轻堆(the young heap)和年老堆(the oldheap),年轻堆的数据在经历过两轮小回收后还存活的话,会被转移到年老堆。复制:gc时会计算新堆的大小并重新申请空间,将旧堆存活数据复制到新堆回收类型:小回收(minor_collection):只对年轻堆进行垃圾回收大回收(major_collection):年轻堆和年老堆都进行垃圾回收首先我们来看erl的进程结构(erlang_process.h)中,关于内存管理的一些字

2020-08-13 15:31:09 2908

原创 erlang send_after 源码剖析

概念简介:tick最小单位为1毫秒每个调度进程有自己的时间轮–(soon轮 later轮)soon轮 早轮早轮的每个槽宽度为1个tick,一共有2的14次方个槽。存储大约16秒内需要被触发的定时器later轮 晚轮晚轮的每个槽宽度为2的13次方个tick,一共有2的14次方个槽。存储大约37个小时内需要被触发的定时器超过晚轮的定时器,怎么处理?超过晚轮的定时器,暂且称为高级定时器; 没有超过晚轮的定时器,暂且称为普通定时器。高级定时器信息存于ErtsSchedulerData 的timer

2020-07-23 16:14:13 1650

安卓手机QQ自由修改尾巴

可以自由修改安卓手机QQ聊天时候的尾巴, 上线图标显示为pad版

2012-10-06

安卓手机QQ for pad自由改尾巴版

如资源名称,测试可用 安装在安卓手机中 可自由修改QQ聊天时的尾巴 图标显示为pad在线

2012-10-06

特征值行列式计算器

求矩阵行列式,和特征值的小工具。很有用,线代的基础作业就靠它吧。比那些收费的实用。

2011-11-28

空空如也

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

TA关注的人

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