Ruby做純計算還是太慢

2021-08-22 07:47:05 字數 1909 閱讀 4286

寫正題前先羅嗦一句:google的字型檔沒有校對麼?,那麼多低階錯別字,還不讓人刪除。至於哪些錯別字,三表的文章裡有很多搜狗的例子。google做的改進就是把正確的詞排在錯誤的詞前面。我靠,刪除預設詞庫很難啊?通過統計使用者刪除的字詞不能學到點東西啊?逼良為娼不夠厚道,有失和諧吧?

說正題:

這段時間的工作瑣碎繁雜。我不勝其煩,工作間隙便在www.projecteuler.net上做題,權當透氣換腦。projecteuler上的題目都是短小的數字題或詞語題。每道題遵循一分鐘規則,即程式執行時間不超過1分鐘。如果超過了,肯定演算法有問題。多數題用幾行**就能解決,不花太多時間,拿得起放得下,不至讓人沉迷過深,誤了正事,適合休息時自娛自樂。題目做出後,系統便提供相應的論壇鏈結。看其它人五花八門的解法,也是一大樂趣。間或看到精妙的設計,更是額外的獎勵。一般來說c/c++/pascal(包括delphi)的程式行數最多,而最短的程式多是用基於棧的語言,比如forth的變種,j語言。我一般用ruby。這時就看出單就計算速度而言,ruby程式(v1.85)和其它語言的巨大差距。比如下面第97題,要求算出質數s8,28433 x 27830457+1,的最後10位數字。順便說一下,s8是2023年發現的最大non-mersenne質數。現在已經有更大的了。我先用陽春版的演算法,也就是迴圈7830457次,每次都算出中間結果的最後10位數字。結果cygwin g++編譯的程式用了0.66秒(沒有開啟任何編譯優化開關),而ruby程式用了38.8秒。c++程式執行時,cpu的佔用率不到10%,而ruby輕易上了100%,導致電腦風扇狂轉。另外一方面,如果在計算中插入一條列印語句,ruby的cpu消耗馬上降到10%以下。多少可以旁證用ruby寫web應用cpu消耗不是問題,因為web應用的開銷大頭還是io以及網路延遲。 語言

c/c++

perl

python

ruby

耗時(s)

比較奇怪的是,python的user時間才0.01秒,系統時間乾脆為0。不知道為什麼實際時間那麼多。

c++程式:

ruby程式(windows下的ruby不能在cygwin下執行,所以就沒有time命令用了):

即使同python和perl相比,ruby也慢了一大截。

python程式:

perl程式

當然了,這只是陽春版的演算法。我們知道2n裡每位數字重複的頻率是4x5n-1。這裡的n是該數字倒數的位數。比如說22=4, 那我知道26的最後一位數字肯定是4,因為6-2 = 4 = 4 x 51-1。有了這個規律,ruby的**就簡化為找到當冪為7830456時前十位重複的數字。而這項工作不過是簡單的求餘。於是效能的差異因為演算法的改進而大幅改進。

ruby做介面測試

ide rubymine http介面請求 unirest,ruby單元測試框架 rspec 新建工程,在工程目錄下,執行 rspec init 初始化rspec工程 可以看到工程下生成了兩個檔案.rspec和spec rspec helper.rb rspec 用於命令列引數的配置 rspec h...

ruby初學做的筆記

int型別ruby 關鍵字 begindonextthen endelseniltrue aliaselsifnotundef andendorunless beginensureredountil breakfalserescuewhen caseforretrywhile classifretu...

Ruby 延遲計算與優化

ruby 的延遲計算大家已經用得很多了,下面就是乙個範例 def current user current user user.where id session user id first endend def foo current user current user endend但這個範例有乙個...