Java Kotlin double类型比较操作


Java

Java中double的比较操作简单靠谱的有两种
1、Double.valueOf(0.0).compareTo(0.0)
2、BigDecimal.valueOf(0.0).compareTo(BigDecimal.Zero)

注意,在java中两个double相等比较不能用==

Kotlin

Java中double的比较操作简单靠谱的有三种
1、0.0.compareTo(0.0)
2、0.0 == 0.0
3、BigDecimal.valueOf(0.0).compareTo(BigDecimal.Zero)

注意,在Kotlin中两个double相等比较可以用==

那么他们的效率如何呢?本文使用JMH来做基准测试。
Java JMH代码Git
Kotlin JMH代码Git

1、Java测试代码

package jmh.benchmarks;
import org.openjdk.jmh.annotations.*;
import org.openjdk.jmh.runner.Runner;
import org.openjdk.jmh.runner.RunnerException;
import org.openjdk.jmh.runner.options.Options;
import org.openjdk.jmh.runner.options.OptionsBuilder;
import org.openjdk.jmh.runner.options.TimeValue;

import java.math.BigDecimal;
import java.util.concurrent.TimeUnit;

@BenchmarkMode(Mode.AverageTime)
@OutputTimeUnit(TimeUnit.MICROSECONDS)
@State(Scope.Thread) //Thread: 该状态为每个线程独享。
public class JavaBasicBenchmark {
    @Benchmark
    public void doubleCompare() {
        boolean b = Double.valueOf("0.00").compareTo(0.0) == 0;
    }

    @Benchmark
    public void BigdecimalCompare() {
        boolean b = BigDecimal.valueOf(Double.valueOf("0.00")).compareTo(BigDecimal.ZERO) == 0;
    }

    public static void main(String[] args) throws RunnerException {
        Options opt = new OptionsBuilder()
                .include(JavaBasicBenchmark.class.getSimpleName()) //benchmark 所在的类的名字,注意这里是使用正则表达式对所有类进行匹配的
                .forks(2) //进行 fork 的次数。如果 fork 数是2的话,则 JMH 会 fork 出两个进程来进行测试
                .warmupIterations(2) //预热的迭代次数
                .warmupTime(TimeValue.valueOf("3"))
                .measurementIterations(5) //实际测量的迭代次数
                .measurementTime(TimeValue.valueOf("3"))
                .build();

        new Runner(opt).run();
    }
}

测试结果。将double转为Double然后使用compareTo效率更高

Benchmark                             Mode  Cnt  Score   Error  Units
JavaBasicBenchmark.BigdecimalCompare  avgt   10  0.081 ± 0.006  us/op
JavaBasicBenchmark.doubleCompare      avgt   10  0.031 ± 0.003  us/op

2、Kotlin测试代码

package jmh.benchmarks

import org.openjdk.jmh.annotations.*
import org.openjdk.jmh.runner.Runner
import org.openjdk.jmh.runner.options.OptionsBuilder
import org.openjdk.jmh.runner.options.TimeValue
import java.math.BigDecimal
import java.util.concurrent.TimeUnit

/**
 * Created by tony on 2018-12-10.
 */
@BenchmarkMode(Mode.AverageTime) // 基准测试的模式,采用整体吞吐量的模式
@OutputTimeUnit(TimeUnit.MICROSECONDS) // 基准测试结果的时间类型
@State(Scope.Thread)
open class KotlinBasicBenchmark {

    @Benchmark
    fun doubleEqual() {
        val b = "0.00".toDouble() == 0.0

    }

    @Benchmark
    fun doubleCompare() {
        val b = "0.00".toDouble().compareTo(0) == 0
    }

    @Benchmark
    fun double2BigDecialCompare() {
        val b = BigDecimal("0.00".toDouble()).compareTo(BigDecimal.ZERO) == 0
    }

    companion object {
        @JvmStatic
        fun main(args: Array<String>) {

            val options = OptionsBuilder()
                    .include(KotlinBasicBenchmark::class.java.simpleName)
                    .forks(2) //进行 fork 的次数。如果 fork 数是2的话,则 JMH 会 fork 出两个进程来进行测试
                    .warmupIterations(2) //预热的迭代次数
                    .warmupTime(TimeValue.valueOf("3"))
                    .measurementIterations(5) //实际测量的迭代次数
                    .measurementTime(TimeValue.valueOf("3"))
                    .build()
            Runner(options).run()
        }
    }
}

测试结果。直接使用==判断相等性效率最高

Benchmark                                     Mode  Cnt  Score   Error  Units
KotlinBasicBenchmark.double2BigDecialCompare  avgt   10  0.072 ± 0.048  us/op
KotlinBasicBenchmark.doubleCompare            avgt   10  0.075 ± 0.015  us/op
KotlinBasicBenchmark.doubleEqual              avgt   10  0.036 ± 0.027  us/op
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 224,861评论 6 522
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 96,263评论 3 402
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 172,033评论 0 366
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 60,999评论 1 300
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 70,000评论 6 400
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 53,483评论 1 314
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 41,850评论 3 428
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 40,827评论 0 279
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 47,366评论 1 324
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 39,404评论 3 346
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 41,525评论 1 355
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 37,130评论 5 351
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 42,853评论 3 338
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 33,293评论 0 25
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 34,426评论 1 276
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 50,082评论 3 381
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 46,590评论 2 366

推荐阅读更多精彩内容