博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
erlang中application来获取变量与ets获取变量的速度比较
阅读量:5797 次
发布时间:2019-06-18

本文共 1913 字,大约阅读时间需要 6 分钟。

hot3.png

今天有些数据要缓存起来获取,分别比较了application和ets获取变量的方法。

结论:

appcation:get_env/2 方法和 ets:lookup/2 方法都是只需要一次ets读,最快。如果在程序运行过程中插入数据可以选择ets:lookup/2,像现在rebar3可以在程序启动后把数据存储在appcation变量里面,可以选择appcation:get_env/2。另外ets:lookup/2要自己写比较逻辑,appcation:get_env/2已经封装好逻辑了,使用相对简单。

application:get_env/1方法需要2次读ets,相对较慢。
mnesia:dirty_read/1方法需要3次读ets,最慢,但可以在多个节点中使用。

参考:

Generally, the performance should be insignificant, but…ets:lookup/2:   1 ets read (duh), but obviously, you need to write more codeapplication:get_env/2:  1 ets readapplication:get_env/1:   2 ets reads (one to find the current application)mnesia:dirty_read/1:   - 1 get()  - 3 ets reads, if data is local (where_to_read, storage_type, lookup)Beyond the performance differences, there are semantic issues. Application environment variables are really meant to be static, either hard-coded in the .app file, or overridden at startup. They can also be changed at upgrades, but the expectation isn't that they change dynamically.In fact, for data that is truly static, the fastest access is if the data is simply hard-coded in an erlang module. Given that modules are easy to reload, these values can still be changed with low frequency.So for system preferences, it is generally better to store the values in a database.

代码实现:

%% appcation.erlget_env(Key) ->     application_controller:get_pid_env(group_leader(), Key).get_env(Application, Key) ->     application_controller:get_env(Application, Key).%% application_controller.erlget_pid_env(Master, Key) ->    case ets:match(ac_tab, {
{application_master, '$1'}, Master}) of [[AppName]] -> get_env(AppName, Key); _ -> undefined end.get_env(AppName, Key) -> case ets:lookup(ac_tab, {env, AppName, Key}) of [{_, Val}] -> {ok, Val}; _ -> undefined end.

可以看到application:get_env/1要使用ets:match/2方法,理论上要慢很多。

代码实现都是从名为ac_tab的ets表里面读取变量内容。

mnesia就不贴代码了,我现在还不够深入理解,以后有机会再理解。

转载于:https://my.oschina.net/u/191928/blog/684893

你可能感兴趣的文章
Smartisan OS一步之自定义拖拽内容
查看>>
海贼王十大悲催人物
查看>>
B树文件系统树
查看>>
org.hibernate.MappingException: No Dialect mapping for JDBC type: -1 搞定!
查看>>
热点热词新闻资讯API开放接口(永久免费开放)
查看>>
【第二章】 IoC 之 2.2 IoC 容器基本原理 —— 跟我学Spring3
查看>>
8.1_Linux习题和作业
查看>>
我的友情链接
查看>>
11.排序算法_6_归并排序
查看>>
Redis redis-cli 命令列表
查看>>
.NET框架设计—常被忽视的框架设计技巧
查看>>
ios中摄像头/相册获取图片,压缩图片,上传服务器方法总结
查看>>
BigDecimal 舍入模式(Rounding mode)介绍
查看>>
开源 免费 java CMS - FreeCMS1.2-标签 infoSign
查看>>
开源 免费 java CMS - FreeCMS1.9 移动APP生成栏目列表数据
查看>>
git reset 三种用法总结
查看>>
GO语言语法基础
查看>>
Android多任务断点续传下载
查看>>
viewpager的layout_width="wrap_content"无效问题
查看>>
ANDRO - MULTIPURPOSE OPENCART 2.X 自适应主题模板 ABC-0651
查看>>