タグ

CとProgrammingに関するagwのブックマーク (145)

  • PyPyがCより速いケース - karasuyamatenguの日記

    パイパイ(この名前ちょっとヤバいね)は場合によってはCより速いコードを生成することがあるという例。決してPyPyが一般的にCより速いと主張しているわけでないない。 http://morepypy.blogspot.com/2011/02/pypy-faster-than-c-on-carefully-crafted.html どうしてこういうことになるかというと、Cはモジュール(.o)の壁を越えて関数をインラインすることができないからだ。JITはそんなものおかまいなしにインラインすることができる。動的最適化の利点だ。 Python x.py def add(a, b): return a + by.py: from x import add def main(): i = 0 a = 0.0 while i < 1000000000: a += 1.0 add(a, a) i += 1 m

    PyPyがCより速いケース - karasuyamatenguの日記
  • overlasting.net

    agw
    agw 2011/02/14
    printfに対する"%.*s"。
  • C言語で構造体を初期化する方法 - 揮発性のメモ2

    よく忘れてを見るのでメモ typedef struct { int c; int d; } hoge_t; typedef struct { int a; int b; hoge_t hoge; } piyo_t; 入れ子の構造体を用意 初期値を順番に書く方法 piyo_t p1 = { 1,2,{3,4} }; // 普通な書き方 piyo_t p2 = { 1,2, 3,4 }; // 順番さえあってればどうでもいい piyo_t p3 = { 1,2, }; // 途中までしかないときは、残りはゼロになる 最後のカンマは無視されるので、付けっぱなしの方が楽 変数名を指定する方法 // 昔風の書き方 piyo_t p4 = { a : 1, // 変数名 コロン 初期値 b : 2, hoge : { // 入れ子も同じように c : 3, d : 4, }, }; // 今風の書き

    C言語で構造体を初期化する方法 - 揮発性のメモ2
  • 多次元配列のポインタ渡し - SHIMIZUS (メソ気象学 , Linux情報 by 清水慎吾 <shimizu shingo>)

  • ポインタ虎の巻~多次元配列の実現

    面白いことに、p == *p である。これはポインタが指す対象が配列でありポインタではないから、間接参照が生成されないのである(逆に言えばポインタの場合には、*p が間接参照をして、p != *p になる)。 上の表の結果と、二次元配列のシンボル x は、実質上一次元配列であることから、次のキャストは成功することになる。 int *p = (int *)x; だから次のように書ける。 int x[10][10]; int i; int *p = (int *)x; for( i = 0; i < 100; i++ ) { *p++ = i; } printf( "x[5][5] = %d\n", x[5][5] ); これは x が実質上一次元のポインタであることを示している。 この事情は関数引数の場合も同様である。二次元配列とポインタは混同されず、しかし int (*p)[10] とは一

  • 初級C言語Q&A(13)

    初出: C MAGAZINE 1996年6月号 Updated: 1996-07-01 [←1つ前] [→1つ後] [↑質問一覧] [↑記事一覧] [ホームページ] 標準ライブラリ C言語は関数という単位で処理を行うことにより、プログラマーがプログラムに 自由に新しい機能を追加することが簡単になっています。しかし、作った関数が 実は標準ライブラリにある関数だった、というのも無駄な話です。今回は標準ラ イブラリに関する大雑把な内容に関するQ&Aです。各関数の仕様の詳細はコン パイラに付属しているリファレンスマニュアルなどを参考にしてください。 ライブラリ Q 【標準ライブラリ】 標準ライブラリとは何か。 A 標準的なC言語、一般的にはANSI Cで定められているライブラリ関数のことです。 あるいは、これらの関数が格納されたライブラリを意味することもあります。 他の言語では、入出力のような処理

    agw
    agw 2010/11/29
    qsortにてstrcmpを使う。
  • Pythonを高速化しよう! - gumi Engineer’s Blog

    はじめまして、gumiの津村です。 現在は解析系の仕事をしたり、ツールを作ったりしています。 今回の話は高速化についてです。 結構長めの文章です。 目次 実行速度の高速化 Python/C API ctypes Pyrex Cython SWIG その他 纏め 実行速度の高速化 高速化といっても色々ありますが、今回は実行速度の高速化についてです。 弊社ではPythonを全面的に採用していますが、そもそもLLは実行速度が遅い言語です。特にC言語のようなコンパイラ系の言語と比べると非常に遅いです。 それでもLL系の言語がここまで使われるようになったのは、開発効率が良いからです。 もはや常識ですね。 しかし、それでも特定の領域ではどうしてもPythonのようなLL系言語では厳しい部分も出てきます。 アルゴリズムを変更しても、ハードウエアを変えても、無理な物は無理です。 速度に問題がある場合の最適

    Pythonを高速化しよう! - gumi Engineer’s Blog
  • 5.4 整数除算 - プログラミング言語 C の新機能

    5. 整数型 今まで C 言語の整数型は char、short int、int、long int 型がありましたが、今回からこれに加え _Bool 型と long long int 型が使用可能になります。章ではこれら新たに加わった二つの整数型と変更された整数の除算ルールについて説明します。 5.1 _Bool 型 多くの人が使っていたけど、言語仕様の中では規定されていなかった...。今度の新しい C 言語では、それが仕様に取り込まれました。それとは bool 型です。多くの人が bool や _bool, BOOL, Bool などと typedef あるいは define をして使用していますが、とうぜん各人によってその名前はバラバラでした。したがって他人の作ったライブラリを利用するとき定義が衝突したりしり、ソースプログラム上で表記の統一がとれなくなったりして、問題が発生しました。

    agw
    agw 2010/10/26
    long long int型について。
  • 文字列操作は「C言語最大の欠点」か? | スラド デベロッパー

    ITProのコラム「記者の目」は複数の日経BPの雑誌記者が記事にはしにくい個人的な意見などを書いている人気コラムだが、最近「C言語最大の欠点」というタイトルのコラムが掲載された。 どうやらタレこみ子と同世代らしい記者は、C言語最大の欠点を文字列処理であると断じ、特にバッファーオーバーフローの回避のためのコードを書くのが大変なところと論じている。そして、C++でSTLのstringクラスを使うべし、と主張している。 タレこみ子の乏しい経験からいうと、バッファーオーバーフローの問題は確かに大きな問題だが、それは「文字列」処理で起きるというよりは、ネットワークから受信する「データ列」の処理で起きるケースのほうが多いように思う。STLについては詳しくないのだが、stringクラスは'\0'も含みうるデータ列を正しく処理できるのだろうか。 また、バッファーオーバーフローは問題として理解しやすく、コー

  • qsort (C関数)

    標準ライブラリ関数 qsort は, stdlib.h の中で次のように宣言されており,ポインタ base を先頭とする配列(ただし,要素数は num,一つの要素のサイズは size)の内容を,指定された比較方法 compareで昇順に並べ替える関数である. void qsort(void *base, size_t num, size_t size, int (*compare)(const void*, const void*)) この関数の使用例は次のようになる. #include <stdlib.h> int compare_int(const void *a, const void *b) { return *(int*)a - *(int*)b; } main() { int data[] = {4, 2, 3, 6, 3, 2, 1, 3, 5, 7}; int i; qso

    agw
    agw 2010/10/15
    関数の型キャストについて。
  • Bal4u : C/UVa

    人が得意としているのはC言語(C++でも,C#でもありません).数値計算・数論・ソート・検索・計算幾何学・符号・文字列照合等数多くのC言語用ライブラリがここに置いてあります. また,2004年末頃から,スペインにあるオンライン・プログラミング・コンテスト・サイト に参戦していた.参戦記や解答プログラムの一部もここに公開しています. 効率的に約数の個数を求めるアルゴリズムを考えているが、まだ四苦八苦している状態。つまり、1~500万までの整数について、それぞれの約数の数を一気に求めたい。 個々の整数なら、素因数分解して、因数の指数の積で約数の数が分かるのだが、1個1個やっているのでは、遅すぎて話にならない。 それよりも多少高速なプログラムは以下の通り。それでも数秒かかってしまう。 #define MAX 5000000 int c[MAX+10]; /* 約数の数を記録する */ void

  • KFCR、GPGPU向けCコンパイラ「Goose」 - ATI Stream/NVIDIA CUDAに両対応 | パソコン | マイコミジャーナル

    K&F Computing Research(KFCR社)は、GPU等のSIMD型ハードウェアアクセラレータ向けCコンパイラ「Goose」をリリースした。標準価格はパーソナルエディションで99,750円、インスティテューショナルエディションで498,750円。いずれの製品にもコンパイラ体のソースコード(rubyで記述)が付属。価格には1年間の無償バージョンアップと技術サポートを含んでいる。 Gooseは、GPUを含む各種アクセラレータのAPIやアーキテクチャを、アプリケーションプログラムに対して隠蔽する。そのためPC等の汎用計算機向けにC言語で記述されたプログラムを、ソースコードをほとんど変更することなくアクセラレータ上で動作させられる。 あえてC言語の言語仕様を完全にはサポートせず、ドメイン特化型のコンパイラとなっている。SIMD型アクセラレータ上での実行に適した文法記述のみを処理し、

  • Cプリプロセッサメタプログラミングで、文字列系泥沼関数型プログラミング - 簡潔なQ

    今年の文化祭で書いた記事です。 - C言語といえば、いやなイメージ、過去の遺産といった感じがあるかもしれません。 C言語のネガティブな側面というと、やはりポインタやメモリ管理などが難しい、ということが思いつくかもしれません。 しかし、C言語のポインタは表記に騙されやすいだけで、仕組み自体は全く難しくありません。 文法も、どこぞのPerlC++と比べたら屁でもない単純さです。 実のところ、仕様が煩雑で難しいのは、Cプリプロセッサなのであります。 普段からあまり複雑な使いかたをしないから気づかないかもしれませんが、Cプリプロセッサの置換処理は、欺瞞と裏切りに満ちた世界なのです。 これが進化するとテンプレートなどといったもっと面白いものになるのですが、今回はCプリプロセッサで計算をしちゃったりするところまで試しにやってみましょう。 (なお、GCCにより実験的に調べた記事なので、他のCコンパイラ

    Cプリプロセッサメタプログラミングで、文字列系泥沼関数型プログラミング - 簡潔なQ
  • 最新Cコンパイラーの最適化事情 - Radium Software

    State of the art C compiler optimization tricks, Felix von Leitner, Linux Kongress 2009. 最近のCコンパイラーの最適化能力についてまとめたプレゼンテーション。定数の扱いやインライン展開などの基的な項目から始まって,分岐の削除やベクトル化, SIMD 化など,最新のコンパイラーに搭載されている様々な機能について調べている。 この手の分岐の削除はほとんどのコンパイラーで有効らしい。 ベクトル化については gcc がだいぶ頑張っている印象。 「gcc は全プラットフォームにおいてビデオコーデックプログラマーより賢い」 これらの最適化が実際のコードでどのように機能するか気になって逆アセンブリコードを覗いてみる人も少なくないと思うけれど,それを代わりにやってくれた感じだ。この手の話題に興味がある人ならば,目を通

    最新Cコンパイラーの最適化事情 - Radium Software
  • gccを用いたCの共有ライブラリの作り方 - シリコンの谷のゾンビ

    ゆとりなもので,ついこないだまで動的リンクと静的リンクの違いがわかっていなかった.動的リンクというのが理解できた頃,そっかユーティリティライブラリは自分で共有ライブラリ作ってしまえばいいんだ,というごく当たり前のことが理解できた. UNIXをさわりはじめていた初期の頃,mecab.soのシンボリックが〜〜という用なハマりがあったのだけれど,あれは要するに実行時に共有ファイルへのパスを指定してあげればよかっただけのこと. わかると当たり前だけれど,わからないと「何がわからないのかわからない」状態に落ち込むなぁ,と改めて思いました. (幸いなことに,僕の周りには「ゆとり乙ww」と指導してくれる方々がいるので認識できるようになるのですが,少なくとも大学(院)時代はそうでなかったわけで,ゆとりスパイラルの恐ろしさを体感した気がしています.) というわけで自分用共有ライブラリの作り方をきちんと理解で

    gccを用いたCの共有ライブラリの作り方 - シリコンの谷のゾンビ
  • Bonanzaで使われているinsertion sortとは何か? - Bonanzaソース完全解析ブログ

    ■ Bonanzaで使われているinsertion sortとは何か? Bonanzaで使われているsort(並べ替え)は、 1) insertion sort 2) shell sort 3) quick sort の3種類である。 3)はCのqsort関数を呼び出しているだけなので解説は不要だろう。また、3)は定跡データベースのメンテナンスにのみ使われており、実際の探索で使われているのは1),2)のみだ。 また、2)には1)が必要である。そこで、今回は1)について解説する。 ■ Bonanzaのnext.c Bonanzaのnext.cは、次の指し手を生成するcoroutineである。ここでinsertion sortが使われている。 指し手生成をcoroutineにしないでいきなり全部の手を生成したり、全部の手に対して点数をつけてquick sortしたりすると劇的なパフォーマンスの

    Bonanzaで使われているinsertion sortとは何か? - Bonanzaソース完全解析ブログ
  • “本物のマクロ”でCのコード行数を半分に! - @IT

    2009/09/07 毎年夏に開催される軽量プログラミング言語(LL:Lightweight Language)をテーマにした「LLイベント」。第7回目となる「LLTV」が、2009年8月29日に東京・中野で開催された。この記事ではプログラムの一部、「大改善!!劇的ビフォーアフター」をレポートする。前編では、Rubyによるfortuneコマンドの“増築”と、Firefox拡張によるslコマンドの実装というネタ系発表をレポートした。中編となる記事では、C言語にLisp風のマクロを取り入れ、lsコマンドのソースコードを約半分に“修繕”する匠の技をレポートする。後編では、売り場業務が滞りがちだった販売管理システムをbashコマンドで“建て直した”という劇的ビフォーアフターの発表をレポートする。 Cで書かれたlsのソースコードの問題点 「Real/Macro Metaprogramming On

  • はてなブログ | 無料ブログを作成しよう

    新米と秋刀魚のわた焼き お刺身用の秋刀魚を買いました。1尾250円です 3枚におろして、秋刀魚のわたに酒、味醂、醤油で調味して1時間ほど漬け込み、グリルで焼きました 秋刀魚のわた焼き わたの、苦味が程よくマイルドに調味され、クセになる味わいです 艶やかな新米と一緒に 自家製お漬物 土…

    はてなブログ | 無料ブログを作成しよう
  • 三項演算子の正しい書き方

    C・C++JavaPerl などのプログラミング言語では、条件演算子として三項演算子?:が用意されている。条件演算子の書き方として、以下のような説明がされることが多い。 condition ? true-expression : false-expression この説明は、以下のプログラムと同じ程度、間違っている。 #include <stdio.h> main( ){printf ("hel" "lo, world\n" );} 条件演算子は、正しくは以下のように書く。 condition ? true-expression : false-expression 使い方の例を示す。 compare = obj1 == null ? obj2 == null ? 0 : -1 : obj2 == null ? 1 : obj1.toString().compareTo(obj2.to

  • C - でも一番右端の立っているビット位置を求めてみた : 404 Blog Not Found

    2009年07月07日03:30 カテゴリMathLightweight Languages C - でも一番右端の立っているビット位置を求めてみた 素晴らしい。 2009-07-04 - 当面C#と.NETな記録 問題の説明はここまでにして、コードの紹介です。Hacker's delight のコードより4〜5倍速く、そして、イミフ加減が半端じゃない!これ一つで 64bit 値以下のすべての値に対応できます。 でも、実際にどれくらい威力があるか試してみたかったのでCに移植してみた。意外な結果が出ております。 0x03F566ED27179461ULL まずは黒魔術。より黒魔術っぽくしてみました。 typedef unsigned long long U64; #define HASH 0x03F566ED27179461ULL static int ntzhash[64]; void i

    C - でも一番右端の立っているビット位置を求めてみた : 404 Blog Not Found