近日團隊舉辦了編程比賽,題目是:解析一個大文件,用最快的速度統計出出前頻率最高的前十個單詞。終最得了第四。這裏我說說個人作法:html
首先,大體看了一下你們的代碼,發現你們都是本身去實現多線程的,其實不必,能夠利用openMP只須要幾行註解就能夠實現並行計算,例如:編程
編譯器就會自動編譯啓動cpu_count個線程來計算,很爽,有木有!編譯時只須要加上兩個參數就能夠了,只是要gcc4.1之後的都支持多線程
另外就是無鎖hash_table,這個能夠參看個人博客:http://www.seflerzhou.net/post-6.htmlide
最後我使用了一種並行合併排序來統計前十的單詞,使用openMP也就幾行代碼,很簡單的,以下:post
除些以外我還使用文件內存映射,單詞hash在掃描時就進行計算(就是掃一個byte算一個,直到非ASCII碼,就能夠獲得本些單詞的hash),這樣基本上就能夠到3s左右,但lf_hash的問題是使用了__sync_add_and_fetch來統計出現頻率,雖然能夠無鎖,但總的來講仍是串行的,所以我就把原來的int改爲int[],每一個線程一個,這樣每一個線程都只寫本身的,不存在競爭區,最後在取出全部entries的時候再進行合併,以下:fetch
從而統計出總的值.net