ラベル Go言語 の投稿を表示しています。 すべての投稿を表示
ラベル Go言語 の投稿を表示しています。 すべての投稿を表示

2009年11月13日金曜日

速っ。。簡単。。


秋元@サイボウズラボ・プログラマー・ブログさんの『GoogleのGo言語によるプロジェクトが既にいくつか』で紹介されていた


Gotracer (マルチスレッド・レイトレーサー)


を自分の環境で試してみました。
512x512 サイズの計算が4秒と経たないうちに終了しました。


しかし、プログラム上のスレッド数を増やしても減らしてもあんまり差がでませんでした。
CPUをモニタしてみると、デュアルコアなCPU利用率に変化がありません。


そんな時は、Go言語の runtime パッケージにある GOMAXPROCS か、そのまま直に指定することで、利用するCPU数を指定できるようです。
試しに、timeコマンドを使って計測してみると

$ GOMAXPROCS=1 time ./gotrace
3.52 real 3.49 user 0.02 sys

$ GOMAXPROCS=2 time ./gotrace
1.84 real 3.49 user 0.02 sys

おぉ!3.52秒→1.84秒で、ほぼ倍速です。
作者さんのBlogを読むと、8コアで試したら5.8倍速になったそうで、悪くないんじゃないでしょうか。

Go言語なら割と簡単にマルチコア・マルチスレッド対応なプログラムが書けそうな気がしてきました。
何も作ってないのに、デュアルコアでは物足りなくなってもっとマルチコアなマシンが欲しくなりました。。

#golang

2009年11月12日木曜日

Go言語でTwitterの公開タイムライン取得

Go言語の練習がてら、Twitterの公開タイムラインを取得してみようと思いました。


とりあえず http.Get を使ってみました。

package main

import (
"fmt";
"http";
)

func main() {
url := "http://twitter.com/statuses/public_timeline.json";

if res, _, err := http.Get(url); err == nil {
buff := make([]byte,512);

for {
if _, err := res.Body.Read(buff); err == nil {
fmt.Printf ("%s", buff);
} else {
break;
}
}

res.Body.Close();
}
}


jsonなレスがそのまま得られたのですが、ちゃんと処理したくなってきました。

jsonパッケージがあったのですが、使い方に自信がなくウェブ検索・・

すると IT戦記さんの「早速 Go 言語を試してみる!」 の記事を発見。
こちらの記事では http.Get がうまく行かなかったと書かれていたのですが、なんとなく上記のコードでいけそうなので json 処理部分だけコードを拝借して確認してみました。

package main

import (
"json";
"bufio";
"http";
)

func main() {
url := "http://twitter.com/statuses/public_timeline.json";

if res, _, err := http.Get(url); err == nil {
reader := bufio.NewReader(res.Body);

for {
line, err := reader.ReadString('\n');
if err != nil {
if err.String() == "EOF" {
j, _, _ := json.StringToJson(line);
for i := 0; i < j.Len(); i++ {
data := j.Elem(i);
print(data.Get("user").Get("screen_name").String() + ": " + data.Get("text").String() + "\n");
}
}
break;
}
}

res.Body.Close();
}
}


うまくいきました!

#golang

2009年11月11日水曜日

Go言語のインストール

The Go Programming Language
Go言語なるものがでていたので、往年のコンピュータ言語フリークとしては試さねば・・

とりあえず、説明動画を見てみる


とにかく速いらしい。。
この動画では具体的なことがわからないので、とりあえずインストールしてみる。

まずは http://golang.org/ に行ってみた。
右側に Getting Started があるのでそれに従ってみる。。


読み進めると "Go compilers support two operating systems (Linux, Mac OS X) " とある。LinuxとMacに対応か。。

Windowsは??

個人的にWinは使っていないので、とりあえず深く考えないことにして手元にあった Mac でインストール。
以下、備忘録。


◆ ステップ-1 : 環境変数の設定 ◆
$GOROOT, $GOOS, $GOARCH, $GOBIN を指定しないといけないらしいので、.bash_profile に設定して

$ source .bash_profile
で .bash_profile を再読み込みさせる。
ついでに、GOxxx変数に指定したディレクトリは存在しないものだったので、作っておいた。


◆ ステップ-2 : Mercurial と Go のインストール ◆

$ hg
-bash: hg: command not found
$ sudo easy_install mercurial
hgコマンド叩いて Mercurial 入ってないことを確認したので、インストール。
いくつか準備が足りず、インストールに失敗する。。。早く入れたいのでとりあえず Mercurial のサイトから直接ダウンロード( http://mercurial.berkwood.com/ )してインストールした。

$ hg clone -r release https://go.googlecode.com/hg/ $GOROOT
としてみると、
ValueError: unknown locale: UTF-8
となってエラーで止まってしまう。。

.bash_profile に
export LC_ALL=ja_JP.UTF-8
export LANG=ja_JP.UTF-8
とセットして再読み込みさせてみると、今度は通った。。


◆ ステップ-3 : gcc のインストール ◆
”The Go tool chain is written in C. To build it, you need to have GCC, the standard C libraries, and the parser generator Bison installed. On OS X, they can be installed as part of Xcode.”
とあったが、Xcodeは既にインストールしてあるので gcc 環境のセットアップはすんなりスキップ


◆ ステップ-4 : Go のビルド ◆

$ cd $GOROOT/src
$ ./all.bash


◆ ステップ-5 : Hello, World を動かしてみる ◆

$ cat >hello.go <<EOF
package main

import "fmt"

func main() {
fmt.Printf("hello, world\n")
}
EOF
$ 8g hello.go
$ 8l hello.8
$ ./8.out
hello, world
$

オンラインドキュメントには 6g と 6l を使ってビルドする例になっているが、$GOBINのディレクトリの中身をみたら 6g, 6l はなく、8g と 8l になっていたのでそれらを利用。

"6g is the Go compiler for amd64; it will write the output in file.6. The ‘6’ identifies files for the amd64 architecture. The identifier letters for 386 and arm are ‘8’ and ‘5’. That is, if you were compiling for 386, you would use 8g and the output would be named file.8. "

と書いてあるので、そのままですが。。 最初この注意書きを読み飛ばしてビルドできずに焦りました。。


とりあえず、動いた〜!!!

#golang