バックグラウンド
私は最近、.NETスタックを使用するポジションの厳しい技術面接に耐える過程にあります。その中には、このような愚かな質問や、より有効な質問が含まれています。最近、有効な問題に遭遇しましたが、確認するにはここのコミュニティに確認したいと思います。
面接官から、テキストドキュメント内の単語の頻度を数え、結果をランク付けする方法を尋ねられたとき、私は
- ストリームオブジェクトを使用して、テキストファイルを文字列としてメモリに配置します。
- 句読点を無視しながら、文字列をスペース上の配列に分割します。
- 配列とに対してLINQを使用
.GroupBy()
し.Count()
、次にOrderBy()
カウントと言います。
私は2つの理由でこの答えを間違えました:
- テキストファイル全体をメモリにストリーミングすると、障害が発生する可能性があります。それが完全な百科事典だったらどうでしょうか?代わりに、一度に1つのブロックをストリーミングして、ハッシュテーブルの作成を開始します。
- LINQは高すぎるため、必要な処理サイクルが多すぎます。代わりにハッシュテーブルを作成する必要があり、反復ごとに、存在しない場合にのみハッシュテーブルに単語を追加してから、カウントをインクリメントしました。
最初の理由は、まあ、理にかなっているようです。しかし、2番目は私にもっと休止を与えます。LINQのセールスポイントの1つは、ハッシュテーブルのような下位レベルの操作を単純に抽象化することですが、ベールの下では、同じ実装です。
質問
抽象化されたメソッドを呼び出すためのいくつかの追加の処理サイクルを除いて、LINQは、特定のデータ反復タスクを実行するために、低レベルのタスク(ハッシュテーブルの作成など)よりもはるかに多くの処理サイクルを必要としますか?