[Erlang35]Erlang18的time
在Erlang 18中, 我们还是可以使用erlang:now/0
但也已经 deprecated啦,大量使用可能引发瓶颈。
The default time warp mode has the same behavior as before, and the old API still works. Thus, you are not required to change anything unless you want to. However, you are strongly encouraged to use the new API instead of the old API based onerlang:now/0. erlang:now/0 is deprecated, as it is and will be a scalability bottleneck.
By using the new API, you automatically get scalability and performance improvements. This also enables you to use the multi-time warp mode that improves accuracy and precision of time measurements.
具体问题分析可以看看余峰2013年写的。总的就是,有锁,大规模使用可能会引起POSIX time jumping,进而可能不准确。
1. 原来我们取系统时间用的是 erlang:now/0, 在新版API中我们使用erlang:system_time/0代替
1> erlang:system_time().
1456761315297998397
它返回的是当前的 Erlang system time in native time unit. 如果你还是需要原来的erlang:now/1的三元组方式,可以使用
2> erlang:timestamp().
{1456,761486,888869}
那么我们怎么衡量上面说的time unit(时间最小单元)使用convert_time_unit/3把1s转为最小单元是纳秒
3> erlang:convert_time_unit(1, seconds, native).
1000000000
再看
4> Fun = fun() -> Begin = erlang:monotonic_time(), timer:sleep(5000), End = erlang:monotonic_time(), End - Begin end.
#Fun<erl_eval.20.54118792>
5> Fun().
5005813139
得到的结果,根本不是5000000000整。多运行几次Fun().会发现每次的结果都不一样。
2.以前我们经常使用erlang:now/0来规定事件的先后顺序,因为它是单调递增的。
现在我们有了新的API.
6> erlang:unique_integer([monotonic]).
-576460752303423487
这个函数可以帮组我们产生单调数字,但是仅限于同一个runtime system instance。 如果多节点的分布式系统中,就无法保证单调。
如果你想记录事件发生时的顺序和时间。那么可以使用一个二元tuple
7> {erlang:monotonic_time(), erlang:unique_integer([monotonic])}.
{-576458615893212445, -576460752303423487}
如果还要加上系统时间就可以再加上
8> {erlang:monotonic_time(), erlang:unique_integer([monotonic]), erlang:system_time()}.
{-576457144539468688,-576460752303423488,1456762913149935455}
3.如果你只是想产生一个唯一的标示。那么可以使用
9> erlang:unique_integer().
-576460752303423452
或者使用正数的
10> erlang:unique_integer([positive]).
45
4.生成随机数
以前使用erlang:now/0和random.seed生成随机数。现在可以使用
11> random:seed(erlang:monotonic_time(), erlang:unique_integer(), erlang:monotonic_time()).
undefined
12> random:uniform().
0.03920785389270476
5.总结.
不要再使用erlang:now/0啦!
如果你想兼容以前的旧代码,那么快快来看这个官方的例子是怎么做到的:)
https://github.com/erlang/otp/blob/maint/erts/example/time_compat.erl
官方关于time的文档:
http://erlang.org/doc/apps/erts/time_correction.html
When my code crashes all the time, but restarts without anybody knowing

[Erlang35]Erlang18的time的更多相关文章
- [Erlang18]教练!又发现Erlang Shell里面的神奇函数一只
人嘛,总是想提高效率,创造更多的价值,同时也得到更多的选择空间.可一个人的精力,时间终归是有限的,减少自身重复或无意义工作就显得格外重要! 要么懂得授权,要么把重复的工作交给机器来做: 现实: 美 ...
- RabbitMQ、Rdis
RabbitMQ RabbitMQ:官方网址:http://www.rabbitmq.com/ Install Erlang # rpm -ivh erlang-18.3-1.el6.x86_64.r ...
- rabbitmq+ keepalived+haproxy高可用集群详细命令
公司要用rabbitmq研究了两周,特把 rabbitmq 高可用的研究成果备下 后续会更新封装的类库 安装erlang wget http://www.gelou.me/yum/erlang-18. ...
- rabbitMQ安装及部署
1.安装 rpm -ivh erlang-18.3-1.el6.x86_64.rpm, 下载地址:http://www.rabbitmq.com/releases/erlang/ rpm --impo ...
- CentOS7安装RabbitMQ集群
实验环境 RabbitMQ 集群 server1.example.com IP: 10.10.10.11 Node: diskserver2.example.com IP: 10.1 ...
- [2016-03-15]rabbitmq notes
安装 系统:CentOS 6 环境: rabbitmq 依赖的Erlang环境包 wget https://www.rabbitmq.com/releases/erlang/erlang-18.1-1 ...
- RabbitMQ高可用集群配置
1.安装RabbitMQ 1)下载和安装erlang 下载erlang wget http://www.rabbitmq.com/releases/erlang/erlang-18.1-1.el6.x ...
- centos安装rabbitmq
RabbitMQ是流行的开源消息队列系统,是AMQP(Advanced Message Queuing Protocol高级消息队列协议)的标准实现,用erlang语言开发.RabbitMQ据说具有良 ...
- rabbitMQ linux安装
1,下载 erlang (http://www.rabbitmq.com/releases/erlang/) wget http://www.rabbitmq.com/releases/erlang/ ...
随机推荐
- mysql 5.6.15升级到5.6.43
今天闲来无事,观察测试环境的zabbix服务器,发现内存泄漏严重,于是重启了,想起了前几天写的帖子发生了严重的内存泄漏可以把mysql升级到最新的小版本 于是乎就试着升级 old version:5. ...
- 常见的加密和解密算法—AES
一.AES加密概述 高级加密标准(英语:Advanced Encryption Standard,缩写:AES),在密码学中又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准.这个标准用 ...
- 十三.jQuery源码解析之$.type()
512行:出现了一个class2type. 在jQuery中全局搜索这个变量. 这段代码的意思是将一串字符串通过空格分割成数组,并且使用each遍历数组来初始化class2type. 最终的结果应该是 ...
- 六.jQuery源码分析之jQuery原型属性和方法
97 jQuery.fn = jQuery.prototype = { 98 constructor: jQuery, 99 init: function( selector, context, ro ...
- MySql 日期函数比较
查询当天数据 select * from tab where FROM_UNIXTIME(fabutime, '%Y%m%d') = 20121217; mysql TO_DAYS(date) 函 ...
- JVM知识点精华汇总
本文是学习了<深入理解Java虚拟机>之后的总结,主要内容都来自于书中,也有作者的一些理解.一是为了梳理知识点,归纳总结,二是为了分享交流,如有错误之处还望指出.(本文以jdk1.7的规范 ...
- ELK Stack 5.2.2 安装文档
简介: ELK Stack 安装文档,这次都使用最新版本(5.2.2).RPM 包的方式搭建 ELK Stack. 下载地址: https://artifacts.elastic.co/downloa ...
- fast-dfs
转http://www.cnblogs.com/jym-sunshine/p/6397470.html FastDFS安装全过程记录 1.安装准备 HA虚拟IP:192.168.1.208 HA软件: ...
- 【Git】一、Git简介
一.什么是Git Git是一款免费的开源分布式版本控制系统,可以有效的,高速的处理从很小到非常大的文件. 二.Git VS SVN 1. Git 是分布式的,SVN 是集中式的 2. Git 存储的是 ...
- Kubernetes v1.10.x HA 全手动安装教程(TL;DR)
转自 https://www.kubernetes.org.cn/3814.html 本篇延续过往手动安装方式来部署 Kubernetes v1.10.x 版本的 High Availability ...