一般的な処理を関数型の書き方をすると遅い

■ このスレッドは過去ログ倉庫に格納されています
2014/01/26(日) 15:05:44.15
Rubyで関数型とか遅いからやめればいいのに
2014/02/05(水) 19:22:59.93
>>76
100万の数値をソートするなら50万50万に分けた後で並列化できないの?
2014/02/05(水) 19:24:05.94
>>78
いえ、だから関数言語を使うだけで簡単に並列可能に!には
ならなくて並列可能なアルゴリズムに作り変えなきゃならないでしょ?って話。
80デフォルトの名無しさん
垢版 |
2014/02/05(水) 19:24:44.61
>>78
手続き型で並列化するには特別なコードが必要
関数型なら普通に書けば・・・
2014/02/05(水) 19:26:22.67
特別と言ったって
たいして特別でもないよなぁ。
ローカル変数使っていればいいだけだし。
82デフォルトの名無しさん
垢版 |
2014/02/05(水) 19:27:09.98
関数型に不可能なことはないのです。
なぜなら自分自身を書き換え進化していくことができるからです。
83デフォルトの名無しさん
垢版 |
2014/02/05(水) 19:28:07.96
いや、普通のクイックソートを書けば自動で並列化してくれる
夢の言語に対して並列化のための特別な(余計な)コードが必要という意味で
2014/02/05(水) 19:28:48.30
もう全部OSがやってくれればいいのに
2014/02/05(水) 19:30:27.04
>>78が書いているように
> 100万の数値をソートするなら50万50万に分けた
という、分ける処理をしないといけないしね。

1. 分ける
2. 並列で処理する
3. 統合する

単なる1工程で良かった処理が
3工程に分かれてしまう。
もうこれアルゴリズムが変わってるから。
2014/02/05(水) 19:33:39.42
ScalaだとActorクラスをラッパーとして使えばいい感じにできそうだけどそれも無駄なコードだからなあ
2014/02/05(水) 19:33:47.74
RPGの町にいる人みたいに各々がその他と
かかわらずに独立しているようなものなら
並列化しやすいんだけどね。

多くの問題は、一つのデータの塊を扱うことが多い。
その塊を処理するには、小さな塊に分割して
終わった後に合わせるという作業が必要になってしまう。

入力データが一つで、出力データも一つだから
並列化しにくいんだよ。
2014/02/05(水) 19:36:56.85
>>87
その人達を並列化しても当たり判定とかを世界全体で同期しないといけないから意味なくね
2014/02/05(水) 19:40:07.98
>>88
同期する量が少なければいいんだよ。

ソートなんか典型的な全データを同期しなければ
いけない処理だからね。
2014/02/05(水) 19:48:27.11
やめろ!おまえら関数型を知るな!
C♯とVBの方がいいぞ!Javaがいいぞ主流だぞ!
関数型はクソだ!!!みんなもクソだと言っているから誰も使ってないだろ
みんなC♯とVBを使ってるだろ。みんなと同じ方が互換性があっっていいのです。関数型は忘れましょう。関数型はクソだぞ使ってると恥ずかしい笑われるぞ。
91デフォルトの名無しさん
垢版 |
2014/02/05(水) 19:49:20.45
簡単な例は手続き型でも簡単にかけるしな
簡単じゃない例は関数型でも難しいしな
並列をウリにするのはおかしい
92デフォルトの名無しさん
垢版 |
2014/02/05(水) 19:51:54.45
宗教とはそういうものです。
2014/02/05(水) 19:52:06.99
そもそもshared mutable stateが問題になるほど複雑な並列処理を行うプログラムを作る人間がこのスレにいるのかどうか
2014/02/05(水) 20:00:14.99
>>91
だな
関数型よりC♯とVBの方が優れてるよな。おれも同意するわ。

>>92
関数型教だよなwww
惑わされずにC♯とVB使うのが情強だ。

>>93
だな。
おれも同意する。C♯の方が良いとみんなも思ってるよ
2014/02/05(水) 20:06:24.04
ドカタ用の汎用プログラミングを侵食するものではないから不安がることは無いよ
96デフォルトの名無しさん
垢版 |
2014/02/05(水) 20:37:29.86
ランダムアクセス(readもwriteも)がO(1)で
クローンがO(1)であるような、リストって作れる?

これが出来れば並列プログラミングがぐっと楽になるぞ?
97デフォルトの名無しさん
垢版 |
2014/02/05(水) 20:38:30.33
できます。
98デフォルトの名無しさん
垢版 |
2014/02/05(水) 20:39:38.49
>>97
どうすんの?普通の俺んちのパソコンでだぞ?
99デフォルトの名無しさん
垢版 |
2014/02/05(水) 20:43:04.38
関数理論を調べてください。
100デフォルトの名無しさん
垢版 |
2014/02/05(水) 20:55:55.52
>>99
みつけた。VListか?
これなんでみんな使わないの?
101デフォルトの名無しさん
垢版 |
2014/02/05(水) 20:57:00.85
関数理論にアレルギーがあるからです。
102デフォルトの名無しさん
垢版 |
2014/02/05(水) 21:01:10.24
これ最強じゃね?普通な配列におとるかもしれないけど
参照でやれば効率いいけど誰かが書き換えないか心配
コピーしてしまえば楽だけど・・・っていうトレードオフをしなくて良い
さっそく、俺の愛用するC#で実装してみるかな
103デフォルトの名無しさん
垢版 |
2014/02/05(水) 21:22:56.61
>>73に一歩近づいたかっていうか
研究者は2002年の時点でこれやってるわけだから
まだ普及した実装がないだけで、今分かっている研究を全て
集結させたコンパイラ作ったらかなり最適化できるのかな
104デフォルトの名無しさん
垢版 |
2014/02/05(水) 21:36:39.70
データ集合体へのアクセスパターンを認識し、集合構造を最適化します。
これは知識と呼ばれるものと同じであり、近い将来において、人工知能に
進化する可能性が危惧されています。
105デフォルトの名無しさん
垢版 |
2014/02/05(水) 22:20:53.60
関数型の利点は並列プログラムをしなくても、意識しなくても、コンパイラが対応すれば出来てしまうところ。
1コア、10コア、100万コアでも同一コードで動かせる。
純粋関数型で、対応コンパイラがあれば。
2014/02/06(木) 00:17:06.85
>>105
残念ながら、現在の並列関数型言語処理系の研究で成果を挙げているのは、
メモリを共有する密結合型並列方式のみ
そして今後半導体の集積技術がどこまで進化するのか予測は難しいが、
せいぜい数十から数百で限界がくるから、
結果的にHPCの世界で研究されている粗結合型超並列へと向かわざるをえない
それを、従来のアルゴリズムで書かれたプログラムを粗結合型並列へ自動変換できる
魔法のコンパイラがたやすく実現できるものだと想像してしまうのは、
素人の浅はかな考えと言わざるをえない
2014/02/06(木) 00:25:51.52
>>77
並列に動く複数のレーザを備えたDVDドライブがあれば、
関数型言語でもI/Oを並列に処理できるよ。
2014/02/06(木) 01:08:10.67
>>64
なんかScalaって読みにくいな

何が読みにくいかって、
xs.length とメソッドっぽい書き方、Array.concat(...) とモジュールっぽい書き方、
と思えばsort(...) と普通の関数っぽい書き方、
さらには xs filter (...) と中置記法の演算子のような書き方、
さらに (pivot >) では中置記法の演算子を部分適用、

なんだかsyntaxが盛りだくさんで統一感がないように思えるんだが。
2014/02/06(木) 03:40:15.90
CだってCで書きやすいようにCPUが設計されてたりするんだし
関数型で書かれたコードを動かすことが前提のプロセッサがあってもいいんじゃないの?
そういうのは世に無いの
2014/02/06(木) 07:43:42.91
標準のコレクション(List)が連結リストな時点で、速いわけがない。
111デフォルトの名無しさん
垢版 |
2014/02/06(木) 19:14:44.32
VListちょっと思ってたのと違うな
fully persistent arrayっていうのが俺の思ってたのに近い
これはclone, read, writeがlog(log(操作数))
112デフォルトの名無しさん
垢版 |
2014/02/06(木) 19:57:23.87
Haskellは問題によってはアセンブラより速いらしいよ。
2014/02/06(木) 21:57:24.60
誰も釣られてくれないようだな。下手糞なアセンブラよりも早いってことかな。
2014/02/06(木) 22:11:03.09
たらいまわし関数をgccとsbclで試したら僅差でsbclの方が速かった
2014/02/06(木) 22:26:42.18
たらい回し言語機w
116デフォルトの名無しさん
垢版 |
2014/02/10(月) 00:16:05.36
細かいところ並列化しても遅いまま。でかいところは、並列化する方法はすぐわかる。
2014/02/10(月) 11:22:15.55
細かいところの並列化って
パイプラインとかスーパースカラでやってるじゃん?
CPU処理の並列化

で、この機能の限界の原因は、なんでも並列化出来るわけじゃないんだよ。
前処理の計算結果に依存する処理があるから並列化出来ない。

これは関数型言語にしても当てはまる話で
できないものはできない。

で、>>116が言うように、でかいところは並列化する方法はすぐわかる。
2014/03/06(木) 03:49:38.86
関数型に魅入られた人は我々と違ってなんか宗教のように関数型を推すけど
あれはなんなんだろうか。なにか彼らの中で現行の言語で許せない何かがあって
よくわからない"それ"からの解放が宗教的恍惚をもたらすのだろうか?

たとえば俺はRPNの電卓を愛用していて日常的に2*3+4*5を
2ent3*4ent5*+と操作して計算しているわけだが
この方が計算機の構造に合ってるしエレガントで速いとは思うものの
「これからの数学では2*3+4*5は2ent3*4ent5*+と表記すべき!未来はそうなる!」
なんてあたまおかしなことはそれが引き起こす「副作用」を考えると
とても言えないわけで。

ちょうど俺が最近のC++やらなんやらのわけのわかんない型や書式、クラスの氾濫に嫌気が差して
あの「なんでもクラスだ」「クラス名は読んでわかる奴にしろ」「メソッドも見てわかるように作れ」で
長い名前だらけでキートップの磨耗をできるだけ防ぎたいプログラマーに絶不評のObjective-C最高じゃん?
ってなってんのと逆ベクトルで、関数型こそ至高!ってなる…なにがあるんだろう?
2014/03/06(木) 04:45:59.26
>>118
近頃の関数型言語周辺の雰囲気は、C言語全盛時代のパソコン通信における
「オブジェクト指向」の雰囲気にそっくり。
2014/03/06(木) 10:48:44.97
どこが?
2014/03/12(水) 00:34:00.68ID:3u/X7b5P
時代は、マルチパラダイムに進んでるけどね。
大枠をオブジェクト指向で作って、細かい部分を関数型で埋める。
2014/03/13(木) 16:01:01.92ID:Rx1X1E2S
クラス=状態がある=テストが書きにくい=管理しにくい
関数=状態がない=テストが書きやすい=管理しやすい
2014/03/13(木) 18:14:20.27ID:6VGDGWK2
そんなに違いは無いと思うけどね。
テストは関数型が断然やりやすいけど。
124デフォルトの名無しさん
垢版 |
2014/03/21(金) 01:37:37.08ID:S2JQ/MM5
自分で使ってF#で書いた方がバグの発生率やそれの修正コスト含めて圧倒的にC#より生産性高いので使えるならF#使うわ。

>>121
だいたいそんな感じやね。大枠にするようなものまで関数型にする必要ないしと言って細かいクラスを乱立させる意味は無い。
2014/03/21(金) 02:34:39.99ID:ftMrioWf
カリー化って何の役に立つの?
呼び出しコストが何倍にもなるだけだと思うのだけど
126デフォルトの名無しさん
垢版 |
2014/03/21(金) 02:35:00.76ID:GtGmhcv1
機械に対するヒントが手続型より少ないのだから、仕方がないだろう。
Fortranだって早くするには、ディレクティブをたくさん書かないといけない。
127デフォルトの名無しさん
垢版 |
2014/03/21(金) 09:00:49.91ID:lULayLj6
>>125
その場その場で適した関数化に役立つ。
むしろ事前適用するので後からの呼び出しコストが減る
2014/03/23(日) 23:39:20.28ID:KDR7IN4o
この関数は副作用ありませんよっていう
キーワードみたいなのが手続き型でも使えれば
デバッグ中にウォッチ式で関数呼び出せたりできて便利な気がする
2014/03/23(日) 23:49:28.28ID:ZhYebgxz
__attribute__((pure))
2014/03/24(月) 01:40:47.03ID:xIV+dpd0
そもそも高級言語は「人間が処理を理解しやすいように」作られてんのに
なんで「こういうわかりにくい書き方をするとこんな利点が!」ってドヤるんだよ
2014/03/24(月) 02:59:59.07ID:CseitgGg
>>130
人間が理解しやすい ≠ お前が理解できる
2014/03/24(月) 10:01:42.73ID:XUp8kLsg
俺にわかりにくいものは、他の誰にも絶対にわかりくい、ってドヤってるバカはおまえだw
2014/03/24(月) 13:52:41.93ID:qjSjB1WB
×高級言語
○高水準言語

単純にハードに近いか遠いかだけなんだけどな。指摘するのが馬鹿らしくなる位に
高級言語としか書かないのしかいないけど。
2014/03/24(月) 14:02:52.49ID:XUp8kLsg
High level languageという表現を見たことが無い奴を篩い分けるいい目安なので、
そういう正しい知識を広めるの、やめてくれないかなw
2014/03/24(月) 14:29:26.54ID:qjSjB1WB
>>134
高級言語ならhigh class languageになるな。
2014/03/24(月) 17:56:30.52ID:LCI3zej9
関数型言語がまったく普及しないのはコードが読みにくいのに
「これが読める俺tueee!」って厨二病しか支持してないせいだよね…
2014/03/24(月) 17:58:21.44ID:XUp8kLsg
ということにしたいのですね、としか言いようがない。
138デフォルトの名無しさん
垢版 |
2014/03/24(月) 22:09:12.40ID:xu/Rafk6
>>136
そういうことだな
139デフォルトの名無しさん
垢版 |
2014/03/25(火) 03:26:52.14ID:YPJ89aQY
>>136
んーわかってる人の中では普通に使われてるからねぇ。
140デフォルトの名無しさん
垢版 |
2014/03/25(火) 04:19:36.70ID:zpGja909
Javaで書かれたソフトウェアを使いたくないエンドユーザーが一般に存在することを
考えると、関数型で書かれたソフトウェアがユーザーに受け入れられがたいのは
容易に想像できます。

例えば、ホビーで良く使われるmebed NXP LPC1768はフラッシュ512KB、RAM32KBを
搭載、C++で開発するのが主流です。

RAMが32KBしかないのです。
この環境で関数型を使いたいでしょうか?

ユーザーはパソコン上であっても、関数型で書かれたソフトウェアを敬遠するでしょう。
アイデアは良かったと思います。
関数型は遠い未来には期待が持てると思います。
でも今は・・・
2014/03/25(火) 04:28:05.32ID:FBko2gtk
訂正

RAMが32KBしかないのです。
関数を使いたくないのは、この環境ぐらいじゃないでしょうか?
2014/03/25(火) 05:06:34.96ID:wfxz3XOd
(関数型(笑))
2014/03/25(火) 08:39:46.40ID:IvUvtejF
関数型言語でどういうコードが「読みやすいか」ってのは、手続き型言語やオブジェクト指向言語に比べてまだ定石のないところだとは思う。
カウボーイコーディングで場当たり的に書いていくと、より手の付けられない状態になりやすいのは関数型言語の方、ってのは実感としてあるがどうか。
2014/03/25(火) 10:40:18.20ID:QImWjIyD
>>140
遠い過去の世界に生きてる人がなんか言ってる、という感じにしか聞こえない。
145デフォルトの名無しさん
垢版 |
2014/03/25(火) 10:43:16.42ID:YPJ89aQY
>>143
むしろオブジェクト指向より歴史あるんだが(´・_・`)
2014/03/25(火) 13:16:02.08ID:XU3TbhQj
正直、C++とか筋の悪いオブジェクト指向言語で
ソースの可読性の問題でやたらバグが出て頓挫するようになったから
"ソースの可読性もクソもないコレで書けばバグが出ないよ!"って
滅んだ過去の亡霊が墓所から這い出て来たようにしか見えない。
2014/03/25(火) 13:27:26.93ID:QImWjIyD
それはお前こそが手続き脳ゾンビだと思うw
2014/03/25(火) 13:43:31.68ID:JLDIFaf/
コンパイラさんから見た可読性が大事なんだよ
2014/03/25(火) 13:49:04.38ID:QImWjIyD
Haskellはむしろ構文解析はめんどいぞ。
PEGの論文書いた人がサンプルに使ったのが、それが理由でJavaの構文を使ってるくらいだからw
150デフォルトの名無しさん
垢版 |
2014/03/25(火) 14:04:37.20ID:YPJ89aQY
まぁ普通に書いたら何でもかんでもオブジェクトにしてスパゲティになるよりも値をトランスフォームしてく関数型の方がバグが少ないのは自明だわな(´・_・`)
2014/03/25(火) 14:22:47.64ID:JLDIFaf/
だがバグのあるプログラムを書く自由は神に与えられた権利

それを脅かす者どもとは戦わねばならない
2014/03/25(火) 15:09:23.71ID:QImWjIyD
Haskellでもバグのあるプログラムは書けるよ。
単に型システムによって蹴落とされるようなバグだけが、コンパイル時に弾かれる、というだけで。
2014/03/25(火) 15:38:21.95ID:XU3TbhQj
C++が勘違いして導入した(そしていまも勘違いしてる奴が多い)オブジェクト指向と違って
本来のオブジェクト指向はオブジェクトにコレをやれとメッセージ(メソッド)を送ると
能動的にオブジェクトが自分で対処するという「ロール」としての区切りだから
本来スパゲティもなんもない。
2014/03/25(火) 15:55:31.26ID:QImWjIyD
本来の、というより、Smalltalk流の、だな。
Simula流を「勘違い」と定義している奴はそんなにいないと思うぞ。
まぁ観測範囲を偏らせれば、それなりにいるのかもしれんが。
155デフォルトの名無しさん
垢版 |
2014/03/25(火) 16:25:19.67ID:YPJ89aQY
>>153
メッセージの実行方式とメッセージをどこに送るかは何も関係ないんだが…(´Д` )
156デフォルトの名無しさん
垢版 |
2014/03/25(火) 17:40:01.96ID:rxYqaddp
>>145
歴史があるかどうかは関係ないんだが(´・_・`)
あらゆるソフトウェア、様々な規模のプロジェクトに適用されていて
経験とプラクティスがより蓄積されているのはどっちか言ってみ?(´・_・`)
157デフォルトの名無しさん
垢版 |
2014/03/25(火) 21:42:23.18ID:YPJ89aQY
>>156
ドカタは知らんかもしらんが、OCamlもHaskellもLispもErlangも色んなものに使われてるんだが(´・_・`)
2014/03/25(火) 21:54:28.24ID:pgzxn/ED
いろんなものというのはな。
たとえば、・・・あとは>>157が答えてくれるはずw
159デフォルトの名無しさん
垢版 |
2014/03/25(火) 22:02:41.15ID:IHAwITvv
LispはAutocadのマクロに使われていたが、いつの間にかVBAが主流に変わっていた。
使いにくさはいい勝負なのでどっちでもいいけど。
160デフォルトの名無しさん
垢版 |
2014/03/25(火) 22:08:49.40ID:IHAwITvv
関数型じゃないけど、Paintshop ProはPythonをマクロに導入して、そこから転落が始まり
ついに表舞台から消え去った。
今はひっそりと裏街道をとぼとぼしてる。
2014/03/25(火) 22:23:56.86ID:Z148p0/G
例えばお掃除ロボットのAIがlispで書かれてたりするみたい
2014/03/25(火) 22:26:01.21ID:B2Pq7RkB
特殊な用途ばかりだね。

お掃除ロボットって作ったことあるかい?
2014/03/25(火) 22:29:19.16ID:Z148p0/G
使ったことすらないよ
164デフォルトの名無しさん
垢版 |
2014/03/25(火) 22:31:38.58ID:IHAwITvv
そもそも関数型はアプリのマクロ程度にしか使いようがない。
ブラウザのスクリプトがJSではなくHaskellだったとしたら、現在のJSと同様に
広まったかもしれない。
そういう言語。
165デフォルトの名無しさん
垢版 |
2014/03/25(火) 22:47:21.88ID:zZmveeSg
関数型は、マルチコアに良いから出てきた。
未来の言語。
まだ、マルチコアに十分に対応したのがない。
166デフォルトの名無しさん
垢版 |
2014/03/25(火) 23:01:12.10ID:IHAwITvv
それは机上の空論の可能性が高いよ。
マルチコアに良いって言うのが副作用が無いことに依存している時点で、
既に使い道がかなり限定される。
ほとんどのユーザーは副作用のためにソフトウェアを利用するんだから。
167デフォルトの名無しさん
垢版 |
2014/03/25(火) 23:05:22.71ID:zZmveeSg
オール純粋関数型でなくてもいい。
マルチコアに対応したいところだけでいい。
CPU、GPUをフル活用しても時間食う処理の部分だけ純粋関数型で書く。
2014/03/25(火) 23:06:19.07ID:Z148p0/G
副作用はあるけど無い部分とうまく分けられる部分が評価されてるんじゃないの
2014/03/26(水) 00:35:10.61ID:R3pTG7sy
OSがタスク振り分けるからプログラムは自分で各コア勝手に弄るな!ってなりそうだよね
170デフォルトの名無しさん
垢版 |
2014/03/26(水) 00:48:06.90ID:74tcteRb
>>166
Haskellだって副作用のあるコードかけんだよ。馬鹿じゃねーの
171デフォルトの名無しさん
垢版 |
2014/03/26(水) 01:02:50.65ID:Tr2CflOd
>>167 Fortran95以降のpure/elemental functionがそれに該当するかもね。
引数わ書き換えたり(Fortranは基本、アドレス渡し)、ファイルI/Oの処理
が内部で禁止される。
スカラーからスカラーへの関数が、ベクトルからベクトルへの関数に自動的に
拡張されて、自動並列化をONにすれば要素毎の演算がコアに割り振られる。
172デフォルトの名無しさん
垢版 |
2014/03/26(水) 02:55:25.28ID:rDn7FARN
こんな問題、インライン化できないスクリプト言語だけ
173デフォルトの名無しさん
垢版 |
2014/03/26(水) 09:59:28.83ID:Pcq/Kh4O
ソースコードから作られてたんだ!
174デフォルトの名無しさん
垢版 |
2014/03/26(水) 20:16:47.96ID:uCn6QoX+

とまあこのように、関数型をマンセーしているのは関数型を使いこなせないでいる人たちってことですわ。
使いこなせる人は悟りを開いて使わない選択をする。
そんな時代ですわ。
2014/03/26(水) 21:42:41.71ID:FbuvqMDP
ということにしたいのですね。
176デフォルトの名無しさん
垢版 |
2014/03/26(水) 23:37:06.47ID:74tcteRb
まぁ今の時代にmutableデフォで作ることがあり得ないけどな
2014/03/28(金) 15:31:32.57ID:oHjvQv92
関数型言語を使いこなすコストパフォーマンスはオブジェクト指向とはさほど変わらないだろうけど、コストとパフォーマンスの総和はオブジェクト指向よりもかなり大きいって感じるなあ。
178デフォルトの名無しさん
垢版 |
2014/03/28(金) 16:02:36.26ID:7nj/VuU5
>>177
C#とF#で作ったもの、概ね速度同等で動くんだが。
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況