タグ

ブックマーク / cpplover.blogspot.com (31)

  • 各言語のARVv7とx86-64での実装のパフォーマンス比較

    LPATHBench/writeup.md at master · logicchains/LPATHBench 同じ箇所に二回訪れずに最も長い経路を見つけるコードで。各言語の実装を、ARMv7とx86-84においてベンチマークしてみた結果が公開されている。 記事に書いてあるように、これは、ARMv7とx86-64のプロセッサーのベンチマーク比較ではなく、各言語の実装が、ARMとx86-64でどれだけ効率的に実装されているのかを比較している。 たとえば、C++はARMにおいてはx86-64の74%のパフォーマンスを出している。しかし、ARM版OpenJDKはなんと29%の速度しか出ていない。OracleによるJava実装は、40%ぐらいのパフォーマンスを出している。 コードはとても短いが、パフォーマンス改善のためのpull requestがどんどんよせられたらしく、その結果が興味深い。Ja

    kasumani
    kasumani 2014/12/22
    各言語のARVv7とx86-64での実装のパフォーマンス比較 同じ箇所に二回訪れずに最も長い経路を見つけるコードで。各言語の実装を、ARMv7とx86-84においてベンチマークしてみた結果が公開されている。 Tags: feedly, ifttt, recently read,
  • Tarse Range-Based forがClangから取り除かれていた

    C++1zには、N3994: Tarse Range-based forが提案されていた。これは、Range-based forで型を書かずにすむようになる小粒な新機能だ。 任意のコンテナーを受け取って、その要素をすべて標準出力に出力する関数テンプレートを書くとする。これは以下のように書ける。 template < typename Container > void print( Container const & c ) { for ( typename Container::value_type & elem : c ) std::cout << elem << '\n' ; } いちいち型を書くのが面倒だ。これにはautoを使えばよい。 template < typename Container > void print( Container const & c ) { for (

    kasumani
    kasumani 2014/12/15
    Tarse Range-Based forがClangから取り除かれていた C++1zには、N3994: Tarse Range-based forが提案されていた。これは、Range-based forで型を書かずにすむようになる小粒な新機能だ。 Tags: feedly, ifttt, recently read, saved for later from Pocket December 15,
  • GNU/Linuxでコマンドラインから喋らせる方法

    の虫: Pingプログラムの話で、pingが通るたびに合成音声ソフトウェアにpingと喋らせた運用が紹介されている。実際にやってみたくなったので、方法を調べることにした。 まず、音声合成を行うコマンドラインのGNU/Linux用のソフトウェアを探さねばならない。調べると、espeakというソフトウェアが見つかった。 apt-get install espeak espeak "Hello. I am espeak." espeakは、何も引数を指定しない場合、stdinから読み取って音声合成していくれる。完璧だ。 さっそく、ためしてみた。 ping localhost | sed -e "s/.*/ping/g" | espeak なぜか動かない。これはsedの出力がバッファされているためだった。 プログラムのバッファリングの外部から操作するには、stdbufが使える。これはGNUのco

    kasumani
    kasumani 2014/10/19
    GNU/Linuxでコマンドラインから喋らせる方法 本の虫: Pingプログラムの話で、pingが通るたびに合成音声ソフトウェアにpingと喋らせた運用が紹介されている。実際にやってみたくなったので、方法を調べることにした。 Tags: feedl
  • cpで大量のファイルをコピーした(4億3200万件、39TB)

    GNUのcpを使って大量のファイルをコピーしたところ、cpの設計上の問題で、極めてコピーが遅かったというお話。 My experience with using cp to copy a lot of files (432 millions, 39 TB) よう。俺は最近、大量のファイルをコピーする必要があったんだが、UNIXは20年もやってきた俺の経験からも、cpの挙動には驚かされたし、俺の意見はコミュニティに共有されるべきだと思う。 環境:古いDellのサーバー(2コア、初期メモリ2GB、追加して10GB、Ubuntu Trusty)と、新しいDellのストレージ格納機(MD 1200)にある、12個の4TBディスクでRAID 6が設定してあって、全体で40TBの要領を持ち、二つのドライブが同時に失敗しても問題ない環境。サーバーは遠隔地バックアップに使われていて、ディスクへの書き込みし

    kasumani
    kasumani 2014/09/13
    cpで大量のファイルをコピーした(4億3200万件、39TB) GNUのcpを使って大量のファイルをコピーしたところ、cpの設計上の問題で、極めてコピーが遅かったというお話。 Tags: from Pocket September 13, 2014 at 01:11AM via IFTTT
  • fork()は失敗するんだぜ、覚えときな

    fork() can fail: this is important あー、fork()のことね。プロセスがもっとプロセス作るためのやつな。いや、他にもプロセス作る方法はあるけどな。ま、面白い話がもうひとつあるから聞かせてやるよ。 forkは失敗するんだぜ。分かってるか? マジで分かってるか? マジだぜ。forkは失敗するもんだ。mallocと同じさ。失敗することもある。そんなに頻繁にってわけじゃないけどさ、でも失敗したら、無視できっこないぜ。ちっとは脳みそ働かせなきゃならん。 forkが0を返したら、そいつは子プロセスで、親なら正数を返すってことは、みんな知ってるよな。その値は子のpidだ。こいつを保存しといて、あとで使うってわけだ。 失敗を確認しない場合どうなるか知ってるか? そうだよ。お前多分、"-1"(forkのエラー通知)をpidとして扱ってるんだろ。 さて、問題の始まりだ。

    kasumani
    kasumani 2014/08/21
    fork()は失敗するんだぜ、覚えときな あー、fork()のことね。プロセスがもっとプロセス作るためのやつな。いや、片方がってことかな。どっちでもいいけどさ。ま、面白い話がもうひとつあるから聞かせてやるよ。 Tags: from Po
  • Linuxカーネルのバグをgit bisectで特定する話

    Odd Bits - Tracking down a kernel bug with git bisect Linuxカーネルのバージョンを3.15に上げたところ、Docker内でのsuやrunuserが謎のシステムエラーで動かなくなった。カーネルのバージョンを3.14に下げると問題なく動作する。明らかにカーネルが影響を及ぼしている。 よろしい、ならばgit bisectだ。git bisectは良いコミットと悪いコミットの間をバイナリサーチして、問題を引き起こしたコミットを見つけてくれる。 しかし、Linuxカーネル3.14と3.15の間には、約15000件のコミットがあるので、git bisectを手動で回すのは現実的ではない。 git bisectには、自動化のための仕組み、git bisect runがある。これは、コミットをチェックアウトした後に、自動でスクリプトを実行して、現在

    kasumani
    kasumani 2014/07/27
    Linuxカーネルのバグをgit bisectで特定する話 Linuxカーネルのバージョンを3.15に上げたところ、Docker内でのsuやrunuserが謎のシステムエラーで動かなくなった。カーネルのバージョンを3.14に下げると問題なく動作する。明らかに
  • JavaScriptのオブジェクト初期化子

    JavaScriptでは、オブジェクトをリテラル風に式の中に書くことができる。これは、オブジェクト初期化子(Object Initialiser)とか、オブジェクトリテラル(Object Literal)と呼ばれている。その文法は、{ }の中にプロパティを記述する。 var a = {} ; var b = { PropertyName : AssignmentExpression } ; var c = { A : 1, B : 2, C : 3 } ; プロパティ名とその値のペアを、コロンで区切って指定する。そしてカンマで区切る。 オブジェクト初期化子は、{}内の最後をカンマで終わらせることもできる。 { A : 1, } ; これは、やや気持ち悪い文法だ。 PropertyNameには、識別子と文字列リテラルと数値リテラルを書くことができる。 var x = { // 識別子 Ide

    kasumani
    kasumani 2014/04/25
    JavaScriptのオブジェクト初期化子 JavaScriptでは、オブジェクトをリテラル風に式の中に書くことができる。これは、オブジェクト初期化子(Object Initialiser)とか、オブジェクトリテラル(Object Literal)と呼ばれている。その文法は、
  • JavaScriptの自動セミコロン挿入

    JavaScriptでは、多くの文は、セミコロンという終端記号を明示的に記述して、文の終わりを示す。 var i = 0 ; ++i ; --i ; しかし、JavaScriptでは、一部の文脈で、セミコロンの省略が許されている。あたかも、セミコロンが自動的に挿入されたかのように振る舞う。これを、自動セミコロン挿入(Automatic Semicolon Insertion) ECMA-262 Edition 5.1 §7.9が規定する、自動セミコロン挿入の定義を、記事では解説する。 まず、三つの基的なルールがある。 プログラムを左から右にパースした時に、文法上許されないトークン(反則トークン, offending token)があった場合、以下の二つの条件のうちどちらかひとつ、もしくは両方を満たせば、セミコロンが自動的に挿入される。 反則トークンと前のトークンが、ひとつ以上の行終端子

    kasumani
    kasumani 2014/04/21
    JavaScriptの自動セミコロン挿入 JavaScriptでは、多くの文は、セミコロンという終端記号を明示的に記述して、文の終わりを示す。 Tags: feedly, ifttt, recently read, saved for later from Pocket April 21, 2014 at 07:53PM via IFTTT
  • JavaScript規格の正規表現リテラルの文面の疑問点

    JavaScript規格、ECMA-262 Edition 5.1を読み進めていて、以下の文面が気になった。 A regular expression literal is an input element that is converted to a RegExp object (see 15.10) each time the literal is evaluated. Two regular expression literals in a program evaluate to regular expression objects that never compare as === to each other even if the two literals' contents are identical. 正規表現リテラルは、リテラルが評価されるごとに、RegExpオブジェクトに

    kasumani
    kasumani 2014/04/19
    JavaScript規格の正規表現リテラルの文面の疑問点 JavaScript規格、ECMA-262 Edition 5.1を読み進めていて、以下の文面が気になった。 A regular expression literal is an input element that is converted to a RegExp object (see 15.10) each time the literal is evaluated
  • JavaScriptのコメントと改行

    今回の記事は、JavaScriptのコメントの文法についての、とてつもなく些細な内容になる。 まず、「改行」の定義について ECMAScript規格では、俗に改行と呼ばれているものは、正式には、行終端子(Line Terminator)と名づけている。行終端子は5個あり、これは4種類の文字からなる。なぜ4種類の文字で5個あるのか。ひとつは組み合わせなのだ。 行終端子を構成する4種類の文字は、\u000A(Line Feed), \u000D(Carriage Return), \u2028(Line separator), \u2029(Paragraph separator)である。 しかし、慣習的に、CRに続くLFを、ひとつの「改行」とみなすことが横行している。JavaScriptはこの慣習を追認する形で、CRLFの2文字をひとつの行終端子として認識する。 さて、題に入ろう。Java

    kasumani
    kasumani 2014/04/19
    JavaScriptのコメントと改行 今回の記事は、JavaScriptのコメントの文法についての、とてつもなく些細な内容になる。 Tags: feedly, ifttt, recently read, saved for later from Pocket April 19, 2014 at 04:54AM via IFTTT
  • Multipath TCPについて

    Multipath TCPとは、複数の経路を扱うためのTCP拡張である。実は、以前、の虫: MultiPath TCPのLinuxカーネル実装という記事で、その実装デモを紹介している。 従来のTCPは、IPとの分離ができない。TCPヘッダーの中には、ひとつのIPアドレスとポートがある。経路ごとにIPアドレスが割り振られるので、経路を変えるには、別のTCPコネクションを貼り直さなければならない。 しかし、複数の通信経路を持つという環境は、もはや珍しいものでも何でもなくなっている。たとえば、多くのラップトップにはEthernetとWiFiの二つの経路があるし、スマートフォンにも、WiFiと3G/4Gという複数の経路がある。特にスマートフォンの場合、経路が使えるかどうかが頻繁に切り替わる。 過去に、TCPで複数のIPアドレスを扱う拡張はいくつも出されたが、いずれも、IPアドレスを隠すという点で

    kasumani
    kasumani 2014/04/19
    Multipath TCPについて Multipath TCPとは、複数の経路を扱うためのTCP拡張である。実は、以前、本の虫: MultiPath TCPのLinuxカーネル実装という記事で、その実装デモを紹介している。 Tags: feedly, ifttt, recently read, saved for later from Pocket Ap
  • JavaとJavaScriptの違い

    JavaJavaScriptには、Unicode escape sequenceというものがある。どちらも同じ文法で、\uに続いて4文字の16進数文字を指定することで、Unicode Code Pointを指定できる。あたかも、Unicode Code Pointを記述したかのように振る舞う。 ところで、JavaJavaScriptは、このUnicodeエスケープシーケンスの使い方が異なる。例えば、行終端文字\u000Aを、以下のように書く。 // これは\u000Aコメント これは、JavaScriptで解釈すると、以下のようになる。 // これは\u000Aコメント 以下は、Javaによる解釈である。 // これは コメント Javaでは、Unicodeエスケープシーケンスが、実際に行終端文字として扱われてしまう。したがって、行終端文字以降が一行コメントからはみ出してしまう。 これ

    kasumani
    kasumani 2014/04/15
    JavaとJavaScriptの違い JavaとJavaScriptには、Unicode escape sequenceというものがある。どちらも同じ文法で、\uに続いて4文字の16進数文字を指定することで、Unicode Code Pointを指定できる。あたかも、Unicode Code Pointを記述したかのように
  • cpの速度を計測する方法

    江添亮 自由ソフトウェア主義者 C++ Evangelist C++標準化委員会の委員 ドワンゴ社員 C++11を執筆した。 株式会社ドワンゴで働いている。 Mail:boostcpp@gmail.com Twitter:@EzoeRyou GitHub: https://github.com/EzoeRyou 江添亮のマストドン@EzoeRyou 筆者にブログのネタを提供するために、品物をアマゾンお気に入りリスト経由で送りたい場合: Amazon.co.jp: 江添亮: 江添のほしい物リスト 筆者にブログのネタを提供するために、直接に品物を送りたい場合、住所をメールで質問してください。 View my complete profile ► 2020 (31) ► December (2) ► November (2) ► September (2) ► August (4) ► Jul

    kasumani
    kasumani 2014/04/09
    cpの速度を計測する方法 ふと、cpの速度を調べてみたくなった。いや、具体的には、ファイルシステムからの読み込みと書き出しの速度だ。 pvはパイプの中間に挟んで、速度を計測するのに使うのが本来の使い方だ。 Tags: fee
  • Rの興隆が科学にオープンソースをもたらす

    How The Rise Of The "R" Computer Language Is Bringing Open Source To Science ⚙ Co.Labs ⚙ code + community 予算削減と科学ソフトウェアコストの上昇のおかげで、オープン科学信者は、科学界にオープンソースを持ち込むことに成功しつつある。あまり知られていない言語、Rも貢献している。 Rとは自由な、オープンソースの統計解析ソフトウェアである。MATLABのような民間に所有されている数値計算ソフトウェアや、SASのような統計ツールは、歴史的に、研究所には必要なツールであった。Microsoft Officeがオフィスに必要なように。しかし、ソフトウェアの爆発的なコスト上昇と、研究費の削減により、科学者はRを使いはじめるようになった。 現在、日々増えつつある多数の研究社がR開発コミュニティに参加し、

    kasumani
    kasumani 2014/04/05
    Rの興隆が科学にオープンソースをもたらす 予算削減と科学ソフトウェアコストの上昇のおかげで、オープン科学信者は、科学界にオープンソースを持ち込むことに成功しつつある。あまり知られていない言語、Rも貢献して
  • MSVC++コンパイラーの中に入っているWebブラウザー

    You Got Your Web Browser in my Compiler! | Random ASCII 筆者は最近、MicrosoftのVC++コンパイラーがmshtml.dll、すなわちInternet Explorerを読み込むことを発見した。/analyzeオプション(静的コード解析を指示)を使うとコンパイラーがこの挙動を示す。筆者はコンパイラーアーキテクチャの専門家ではないが、インターネットエクスプローラーを読み込むコンパイラーというのはいかにも奇妙だ。 これは単なる気持ちの問題ではないのだ。筆者の環境で静的解析を並列コンパイルすると、コンピューターが数分間も反応が悪くなる。どうやらmshtmlウインドウが、その原因らしいのだ。 いつも通り、筆者はxperf/ETWを使って原因を探った。 当に問題なのか? 筆者は問題を探すために何日もの時間を浪費したりはしない。問題が私を

    MSVC++コンパイラーの中に入っているWebブラウザー
    kasumani
    kasumani 2014/04/02
    MSVC++コンパイラーの中に入っているWebブラウザー You Got Your Web Browser in my Compiler! | Random ASCII 筆者は最近、MicrosoftのVC++コンパイラーがmshtml. Tags: feedly, ifttt, recently read, saved for later from Pocket April 02, 2014 at 12:03AM via IFTTT
  • なんでGCCはa*a*a*a*a*a を (a*a*a)*(a*a*a) に最適化できないの?っと

    c - Why doesn't GCC optimize a*a*a*a*a*a to (a*a*a)*(a*a*a)? - Stack Overflow 俺は科学技術計算の数値計算の最適化をしてたんだけどさ。GCCはpow(a, 2)をa*aにしてくれるんだな。うん。で、pow(a, 6)は最適化されずに、ライブラリ関数であるpowを呼んじゃうんだ。パフォーマンス的に最悪。(Intel C++ Compilerはpow(a,6)のライブラリ関数呼び出しを消し去ってくれるんだけどな) どうもよくわからんのが、pow(a, 6)をa*a*a*a*a*aで置き換えて、GCC 4.5.1をオプション"-O3 -lm -funroll-loops -msse4"で使ったら、mulsd命令を5個使う。 movapd %xmm14, %xmm13 mulsd %xmm14, %xmm13 mulsd

    kasumani
    kasumani 2014/03/29
    なんでGCCはa*a*a*a*a*a を (a*a*a)*(a*a*a) に最適化できないの?っと c - Why doesn't GCC optimize a*a*a*a*a*a to (a*a*a)*(a*a*a)? - Stack Overflow 俺は科学技術計算の数値計算の最適化をしてたんだけどさ。GCCはpow(a, 2)をa*aにしてくれるんだな。うん
  • ValveがOpenGLデバッガー、VOGLを公開した

    GNU/Linuxに不自由なソフトウェアを蔓延させる目的で活動してるValveが、VOGLという自社製のGNU/Linux上で動くOepnGLのデバッガーをGitHubで公開した ValveSoftware/vogl まだ開発段階で、ろくにドキュメントもないようだ。早期に公開するという姿勢は評価したい。残念ながら、彼らのソフトウェア流通プラットフォームは邪悪のDRMがかかった不自由ソフトウェアを蔓延させるものなのだが。 Anonymous said... SteamとDRMは関係ないでしょう Valve社に恨みでもあるんですか March 13, 2014 at 9:30 PM Anonymous said... え March 13, 2014 at 9:47 PM Anonymous said... http://steam.wikia.com/wiki/List_of_DRM-fre

    kasumani
    kasumani 2014/03/13
    ValveがOpenGLデバッガー、VOGLを公開した GNU/Linuxに不自由なソフトウェアを蔓延させる目的で活動してるValveが、VOGLという自社製のGNU/Linux上で動くOepnGLのデバッガーをGitHubで公開した ValveSoftware/vogl まだ開発段階で、ろくにドキ
  • Bram MoolenaarがNeovimに反応

    Neovim - Google Groups Vim作者であるBram MoolenaarがNeovimに対してコメントを返している。 大変な仕事になるし、すべてのシステムをサポートすることもできないし、新しいバグが生まれるし、利用者にとって何の価値があるというのだ? 完全なリファクタリングは解決ではない。今あるものを改良するほうがいいのだ。利用者にとってVimが快適になるように、小さなリファクタリングをするのならまだわかるが。 Neovimのニュースを見た時に、まっさきに思い浮かんだし、Hacker Newsでも言及されていたことに、Joel Spolskyのブログ記事がある。 Things You Should Never Do, Part I - Joel on Software Joelは、MozillaがNetscapeがスクラッチから書き直したことを批判し、たとえどんなにコード

    kasumani
    kasumani 2014/02/24
    Bram MoolenaarがNeovimに反応 大変な仕事になるし、すべてのシステムをサポートすることもできないし、新しいバグが生まれるし、利用者にとって何の価値があるというのだ? Tags: feedly, ifttt, recently read, saved for later from Pocket Febr
  • ドワンゴに入社した

    そう。タイトル通りだ。筆者、江添亮はドワンゴに雇用された。一体、どのような経緯でドワンゴに入社するに至ったのか。また、どんな仕事をしているのか。それを説明するには、時系列を追って書いたほうがいいだろう。 2013年8月21日 ふとみると、以下のようなサブジェクトのメールが届いていた。 【ご相談】ドワンゴ主催の C++11, 14 に関する勉強会にスピーカーとしてご参加頂けないでしょうか C++11? C++14? なんと、日C++14などという単語を知っている企業があったのか。しかし・・・ドワンゴ? SPAMだろうか。いや、こんなにピンポイントなSPAMがあるわけがない。 それにしても解せないメールだ。ドワンゴといえば、もちろん、あの有名なニコニコ動画の企業だ。ニコニコ動画と言えばWebサイトだ。ニコニコ動画やその関連サービスの開発にC++を使っているのだろうか。いやまて、たしか子会社

    kasumani
    kasumani 2014/02/14
    ドワンゴに入社した そう。タイトル通りだ。筆者、江添亮はドワンゴに雇用された。一体、どのような経緯でドワンゴに入社するに至ったのか。また、どんな仕事をしているのか。それを説明するには、時系列を追って書
  • テンプレートの実体化の実装方法とODR違反について

    問題 以下のC++コードを考える。 int plus( int a, int b ) { return a + b ; } double plus( double a, double b ) { return a + b ; } このC++コードは、int型とdouble型以外、コードはほぼ同じである。 しかし、ほとんどのコンピューターではint型とdouble型は操作方法が異なるため、この2つの関数は、全く別のコンピューターが処理できるコードに変換される。 ところで、古典的なC言語やC++コンパイラーの実装方法として、ソースコードのファイルをそれぞれ、一つ一つの翻訳単位としてコンパイルし、翻訳単位ごとにオブジェクトファイルを生成し、リンカーで複数のオブジェクトファイルを結合(リンク)して、単一のプログラムを生成するというものがある。 よくある実装では、オブジェクトファイルは、その翻訳単位

    kasumani
    kasumani 2014/02/13
    テンプレートの実体化の実装方法とODR違反について しかし、ほとんどのコンピューターではint型とdouble型は操作方法が異なるため、この2つの関数は、全く別のコンピューターが処理できるコードに変換される。 Tags: from Pock