4 回答

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()
orPow()
。
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()
orPow()
。
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è)試中非常接近。

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é)果?

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 秒的圍棋。y
Math.pow(x,y)
x*x
y==2
pow
x*x
pow

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ì)受到很大影響。
- 4 回答
- 0 關(guān)注
- 237 瀏覽
添加回答
舉報(bào)