第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

Golang 與 Java 的速度

Golang 與 Java 的速度

Go
青春有我 2023-03-21 14:23:20
我用 Java 寫了一個(gè)程序,用 Go 寫了一個(gè)等價(jià)的程序。我的 java 程序執(zhí)行大約需要 5.95 秒,而 Go 程序大約需要 41.675789791 秒。雖然 Go 的速度與 C 或 C++ 相當(dāng),因?yàn)樗?C 一樣編譯,但為什么存在如此大的性能差異?程序如下:圍棋程序package mainimport (    "math"    "fmt"    "time")func main() {    fmt.Printf("vvalue is %v", testFun(10, 16666611, 1000000000))}func fun(x float64) float64 {    return math.Pow(x, 2) - x}func testFun(first float64, second float64, times int) float64 {    var i = 0    var result float64 = 0    var dx float64    dx = (second - first) / float64(times)    for ; i < times; i++ {        result += fun(first + float64(i) * dx)    }    return result * dx}   Java程序public class Test {public static void main(String[] args) {    Test test = new Test();    double re = test.testFun(10, 16666611, 1000000000);    System.out.println(re);}private double testFun(double first, double second, long times) {    int i = 0;    double result = 0;    double dx = (second - first) / times;    for (; i < times; i++) {        result += fun(first + i * dx);    }    return result * dx;}private double fun(double v) {    return Math.pow(v, 2) - v;}}
查看完整描述

4 回答

?
ITMISS

TA貢獻(xiàn)1871條經(jīng)驗(yàn) 獲得超8個(gè)贊

(根據(jù)上述答案的提示,我做了更多測(cè)試,并添加了一個(gè)C版本)

在我的 linux 機(jī)器上,times = 100000000

測(cè)試結(jié)果:

  • 當(dāng)指數(shù) = 2.4

 Java: result: 1.053906e+24, during: 7432 ms
    C: result: 1.053906e+24, during: 5544 ms
   Go: result: 1.053906e+24, during: 8.716807708s
  • 當(dāng) exponent = 2時(shí),仍然使用pow()or Pow()

 Java: result: 1.543194e+21, during: 630 ms
    C: result: 1.543194e+21, during: 852 ms
   Go: result: 1.543194e+21, during: 3.336549272s
  • 當(dāng) exponent = 2時(shí),而是使用x * x。

 Java: result: 1.543194e+21, during: 636 ms
    C: result: 1.543194e+21, during: 340 ms
   Go: result: 1.543194e+21, during: 115.491272ms

概括:

  • 總的來(lái)說(shuō),go是真的快,根據(jù)上次的測(cè)試,比Java,甚至還要快C。

  • 但是,根據(jù)前 2 個(gè)測(cè)試,Java確實(shí)有一個(gè)很好的實(shí)現(xiàn)。pow()


代碼

Test.java:

/**

 * Compile:

 *  javac Test.java

 * Run:

 *  java Test

 */ 

public class Test {

    public static void main(String[] args) {

        Test test = new Test();

    long startAt = System.currentTimeMillis();

        double re = test.testFun(10, 16666611, 100000000);

    long during = System.currentTimeMillis() - startAt;

        System.out.printf("%10s: result: %e, during: %d ms\n", "Java", re, during);

    }


    private double testFun(double first, double second, long times) {

        int i = 0;

        double result = 0;

        double dx = (second - first) / times;

        for (; i < times; i++) {

            result += fun(first + i * dx);

        }

        return result * dx;

    }


    private double fun(double v) {

        return v * v - v;

        // return Math.pow(v, 2) - v;

        // return Math.pow(v, 2.4) - v;

    }

}

測(cè)試.c:


/**

 * compile with:

 *  gcc test.c -lm

 */

#include <math.h>

#include <stdio.h>

#include <stdlib.h>

#include <sys/time.h>


double fun(double v) {

    return v * v - v;

    // return pow(v, 2) - v;

    // return pow(v, 2.4) - v;

}


double testFun(double first, double second, long times) {

    int i;

    double result = 0;

    double dx = (second - first) / times;

    for (i = 0; i < times; i++) {

        result += fun(first + i * dx);

    }

    return result * dx;

}


long long current_timestamp() {

    struct timeval te;

    gettimeofday(&te, NULL); // get current time

    long long milliseconds =

        te.tv_sec * 1000LL + te.tv_usec / 1000; // calculate milliseconds

    // printf("milliseconds: %lld\n", milliseconds);

    return milliseconds;

}


int main(int argc, char *argv[]) {

    long long startAt = current_timestamp();

    double re = testFun(10, 16666611, 100000000);

    long long during = current_timestamp() - startAt;

    printf("%10s: result: %e, during: %lld ms\n", "C", re, during);

    return 0;

}

測(cè)試去:


/**

 * How to run:

 *  go run test.go

 */

package main


import (

    "fmt"

    "math"

    "time"

)


func main() {

    startAt := time.Now()

    result := testFun(10, 16666611, 100000000)

    during := time.Since(startAt)

    fmt.Printf("%10s: result: %e, during: %v\n", "Go", result, during)


    _ = math.Pow

}


func fun(x float64) float64 {

    return x*x - x

    // return math.Pow(x, 2) - x

    // return math.Pow(x, 2.4) - x

}


func testFun(first float64, second float64, times int) float64 {

    var i = 0

    var result float64 = 0

    var dx float64

    dx = (second - first) / float64(times)

    for ; i < times; i++ {

        result += fun(first + float64(i)*dx)

    }

    return result * dx

}

編譯:

javac Test.java; gcc test.c -lm; go build test.go

跑步:

java Test; ./a.out ; ./test

@Update - 帶有-O2-O3選項(xiàng)的 C 程序

正如Raffaello評(píng)論中所建議的那樣,在編譯C程序時(shí),可以使用-O2-O3進(jìn)一步優(yōu)化程序。

并且,以下是程序的測(cè)試結(jié)果C

  • 當(dāng)指數(shù) = 2.4時(shí)。

            C: result: 1.543194e+21, during: 5805 ms
 C with `-O2`: result: 1.543194e+21, during: 5324 ms
 C with `-O3`: result: 1.543194e+21, during: 5326 ms
  • 當(dāng) exponent = 2時(shí),仍然使用pow()or Pow()。

            C: result: 1.543194e+21, during: 897 ms
 C with `-O2`: result: 1.543194e+21, during: 119 ms
 C with `-O3`: result: 1.543194e+21, during: 121 ms
  • 當(dāng) exponent = 2時(shí),而是使用x * x。

            C: result: 1.543194e+21, during: 353 ms
 C with `-O2`: result: 1.543194e+21, during: 122 ms
 C with `-O3`: result: 1.543194e+21, during: 119 ms

摘要-(-O2-O3選項(xiàng)):

  • -O2-O3選項(xiàng)

    • 當(dāng) base 是整數(shù)(例如 2)時(shí),將使 c 程序更快,快幾倍。

    • 當(dāng) base 是浮點(diǎn)數(shù)(例如 2.4)時(shí),它也更快,但非常小。

  • 比較-O2-O3,它們?cè)谏鲜鰷y(cè)試中非常接近。



查看完整回答
反對(duì) 回復(fù) 2023-03-21
?
手掌心

TA貢獻(xiàn)1942條經(jīng)驗(yàn) 獲得超3個(gè)贊

不要從另一種語(yǔ)言翻譯。在 Go 中編寫程序的 Go 版本。例如x*x - x,


package main


import (

    "fmt"

    "math"

    "time"

)


func main() {

    start := time.Now()

    v := testFun(10, 16666611, 1000000000)

    since := time.Since(start)

    fmt.Printf("value is %v\ntime is %v\n", v, since)

}


func fun(x float64) float64 {

    return x*x - x

}


func testFun(first float64, second float64, times int) float64 {

    sum := float64(0)

    dx := (second - first) / float64(times)

    for i := 0; i < times; i++ {

        sum += fun(first + float64(i)*dx)

    }

    return sum * dx

}

輸出:


$ go version

go version devel +5c11480631 Fri Aug 10 20:02:31 2018 +0000 linux/amd64

$ go run speed.go

value is 1.543194272428967e+21

time is 1.011965238s

$

你得到什么結(jié)果?


查看完整回答
反對(duì) 回復(fù) 2023-03-21
?
子衿沉夜

TA貢獻(xiàn)1828條經(jīng)驗(yàn) 獲得超3個(gè)贊

我建議math.Pow(x,y)在 Go 中實(shí)際上沒(méi)有對(duì)whilex^y的整數(shù)值進(jìn)行任何優(yōu)化,而只是為。至少在兩個(gè)程序中用簡(jiǎn)單替換時(shí),Java 的時(shí)間為 6.5 秒,而 Go 的時(shí)間為 1.4 秒。使用代替我仍然得到 6.5 秒的 Java 而 29.4 秒的圍棋。yMath.pow(x,y)x*xy==2powx*xpow



查看完整回答
反對(duì) 回復(fù) 2023-03-21
?
犯罪嫌疑人X

TA貢獻(xiàn)2080條經(jīng)驗(yàn) 獲得超4個(gè)贊

從理論上講,Go 在開(kāi)始時(shí)需要時(shí)間來(lái)編譯所有源代碼,因此它的啟動(dòng)時(shí)間會(huì)很慢,但是當(dāng)它完成啟動(dòng)并一條一條地執(zhí)行命令時(shí),它會(huì)運(yùn)行得很快。執(zhí)行時(shí)間可以與 C/C++ 進(jìn)行比較。你不能僅僅在幾行代碼中比較它們,你會(huì)發(fā)現(xiàn)啟動(dòng)時(shí)間在千文件程序中會(huì)受到很大影響。



查看完整回答
反對(duì) 回復(fù) 2023-03-21
  • 4 回答
  • 0 關(guān)注
  • 237 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)