在这个测试中,我们可以看到golang的性能有时比scala慢得多.在我看来,由于golang的代码直接编译为c/c ++兼容的二进制代码,而scala的代码被编译为JVM字节代码,golang应该具有更好的性能,特别是在基准测试的这些计算密集型算法中.我的理解不正确吗?
我是golang的新手.我写了这样的代码:
package main
import (
"fmt"
)
const (
BIG_NUM = 10 * 1000 * 1000
)
type BigData [BIG_NUM]uint64
func (self BigData) String() string {
return fmt.Sprintf("%d\n", self[0])
}
func (self *BigData) Clear() {
*self = BigData{}
}
func main() {
data := new(BigData)
fmt.Println(data)
}
Run Code Online (Sandbox Code Playgroud)
编译后,可执行文件大约是81M:
$ ls -l
-rwxr-xr-x 1 tchen 522017917 81533376 Dec 19 08:44 test
-rw-r--r-- 1 tchen 522017917 290 Dec 19 08:44 test.go
Run Code Online (Sandbox Code Playgroud)
当我删除Clear()函数时,可执行文件将恢复正常大小.那么为什么这个Clear()函数生成如此大的可执行文件?它应该在运行时调用,而不是编译时间,对吧?
- - - - - - 进一步的调查 - - - …
我有一个名为log_test1的数据库,只有1个上限的收集日志.封顶集合的最大大小为512M.插入200k数据后,我发现db的磁盘使用率为1.6G.使用db.stats(),我可以看到storageSize是512M,正确,但我的实际fileSize是1.6G,为什么会发生这种情况?如何控制磁盘大小只是我的上限集合大小加上索引大小?
> use log_test1
switched to db log_test1
> db.stats()
{
"db" : "log_test1",
"collections" : 3,
"objects" : 200018,
"avgObjSize" : 615.8577328040476,
"dataSize" : 123182632,
"storageSize" : 512008192,
"numExtents" : 3,
"indexes" : 8,
"indexSize" : 71907920,
"fileSize" : 1610612736,
"nsSizeMB" : 16,
"dataFileVersion" : {
"major" : 4,
"minor" : 5
},
"ok" : 1
}
Run Code Online (Sandbox Code Playgroud) 我被告知erlang beam通过模式匹配调整了很多,因此性能比条件表达式要好得多.我在elixir中进行了测试,并使用benchfella进行基准测试.但是,我发现与if/cond相比,模式匹配性能几乎与性能水平相同.
$ mix bench -d 10
Settings:
duration: 10.0 s
mem stats: false
sys mem stats: false
[12:30:08] 1/3: PatternMatchBench.if else performance
[12:30:28] 2/3: PatternMatchBench.cond performance
[12:30:47] 3/3: PatternMatchBench.pattern match performance
Finished in 57.5 seconds
PatternMatchBench.if else performance: 10000 1723.24 µs/op
PatternMatchBench.cond performance: 10000 1723.36 µs/op
PatternMatchBench.pattern match performance: 10000 1726.95 µs/op
Run Code Online (Sandbox Code Playgroud)
下面是核心代码,它基本上将数据格式化为不同情况下的字符串.整个项目可以通过https://github.com/tyrchen/pattern_match获得.
defmodule Ifelse do
def process(data) do
if is_list(data) do
data
|> Enum.map(fn(entry) ->
if is_tuple(entry) do
{k,v} = entry
"#{k}: #{v}" |> transform
else …Run Code Online (Sandbox Code Playgroud) 我的代码看起来像这样:
#!/bin/env node
var collection = require('mongojs')('test').collection('test');
collection.findOne({}, function(err, doc) {
console.log(err, doc);
});
Run Code Online (Sandbox Code Playgroud)
当我运行此脚本时,它显示:
$ node test.js
null null
Run Code Online (Sandbox Code Playgroud)
但剧本没有退出.我需要"CTRL + C"才能退出.任何人都知道如何解决它?
[更新]
我发现如果我使用原生mongodb而不是mongojs,那就没问题:
#!/bin/env node
var client = require('mongodb');
client.connect('mongodb://127.0.0.1:27017/hatch', function(err, db) {
if (err) throw err;
var collection = db.collection('documents');
collection.find().toArray(function(err, results) {
console.dir(results);
db.close();
});
});
Run Code Online (Sandbox Code Playgroud)
这是一个mongojs问题吗?