iT邦幫忙

0

請問PHP如果指定型別,會不會跑的比較快?

TB 2015-06-11 09:11:312539 瀏覽

邦友們好
小弟想請教說
因為最近遇上PHP要一次處裡大量資料的問題
不知道如果指定型別會不會跑的比較快?
又要怎樣指定呢?
google到的強制型別轉換跟指定型別是同一種東西嗎0.0??

因為資料量很大,一次大概要跑2X萬行資料,
目前最少一次要處裡一分鐘左右,
隨著時間的推移要處裡的資料會越來越多,等待越來越久...
使用者已經受不了了,
而且用了PHP的多執行緒反而更慢....

雖然查出效能瓶頸在於分析資料流的部份,
因為是即時變化的資料流,無法預先收集計算整理好,
一定都是即時性的,所以很傷腦筋。

或是有大大有加速PHP的小訣竅,
請教教小弟吧~~~

處理資料的重點在資料庫.
wiseguy iT邦超人 1 級 ‧ 2015-06-11 17:18:08 檢舉
這問題中沒資料也沒程式,無從加速起 ...落寞
weiclin iT邦高手 4 級 ‧ 2015-06-11 18:41:28 檢舉
確實是這樣...大家都來練通靈好了

1 個回答

16
raytracy
iT邦大神 1 級 ‧ 2015-06-11 10:16:22
最佳解答

q00153提到:
即時變化的資料流

即時資料運算慢, 可能會有兩種瓶頸:

  1. Disk I/O 太慢
  2. 軟體運算速度太慢

從硬體層面, 應先量測出運算期間的 DIsk I/O, 是否已經超過硬體負荷水準? 如果硬體超限未改善, 妳的軟體如何改善都沒用, 照樣被硬體拖垮.

軟體運算問題牽涉很多, 有可能演算法寫得不好, 也有可能程式結構不好 (如您所猜測的型別轉換問題), 但也可能是程式語言本身就慢....這些都需要一一去釐清.

我有個客戶用 Java 存取 SQL 資料, 以前都沒有問題, 某天它們將 DB Schema 中的某個欄位型別, 從 varchar 改為 nvarchar, 因為資料內容相同, 所以他們沒有去改程式裡面的 SQL 指令型別.

結果隔天, SQL DB 的 CPU 暴衝, 反應速度奇慢無比, 找我求救, 我幫她從原本的 4 CPU, 一路加到 20 顆 CPU, 才稍微緩解掉速度慢的問題. 問他們原因, 都說:「沒改程式, 不是程式問題」, 後來查出, 因為 Schema 的型別和 SQL 下的指令不同, 導致每一筆 Select/Update/Insert 指令, CPU 都要費時去做型別轉換, 導致 CPU 爆掛...後來將程式裡的 SQL 指令型別改為跟 DB 一致之後, CPU 用量就下降.

另一個例子, 也是 SQL 查詢速度很慢, 經過 SQL Profiler 的分析, 發現是慢在某一條 SQL 指令的邏輯, 將此問題告知設計人員, 經她重新安排 SQL 查詢的邏輯之後, 整體查詢速度提高 12 倍.

此外, 也並不是即時資料就一定只能當場查詢所有資料. 試想, 當你在查詢 20 幾萬筆資料時, 即時資料還是持續在跑啊! 除非你能叫資料停下來. 假設你的需求是: 統計 20 幾萬筆資料的平均值的話, 其實不需要一次撈 20 萬筆, 妳可以用一個 Store Procedure 取代 Insert/Update 的動作, 每進來一筆, 就做一次總平均的計算, 然後把結果存起來. 這樣做, 當最後一筆資料進來後, 平均值就已經算好了, 不需要再重新撈一次所有資料. 雖然每次 Update/Insert 會多花一點點時間, 但是那一點點如果夠快的話, 其實不影響原本的更新動作, 但卻可以省下最後要一次撈數十萬筆的大量時間.

此外, PHP 並非速度最快的程式語言, 如果你確信: 硬體/演算法/SQL邏輯, 都沒有改善的空間了, 那麼可能要考慮提升程式語言本身的能力. 在這個評比中, PHP 花了 44 分鐘才完成評比項目, Python 花了 33 分鐘, 但是 Java 只花了 68 秒.

如果上述條件都成立, 但你沒有能力更換程式語言的話, 可以考慮將 PHP 編譯過再執行, 這類的 JIT Compilation 套件有如: Zend, HHVM等, 都可以加速 PHP 的執行, 不過這是治標不治本.

看更多先前的回應...收起先前的回應...
TB iT邦新手 3 級 ‧ 2015-06-11 13:09:30 檢舉

感激大大的回覆
資料流是基台自動產生的
會一~~~~~直將生產的資訊拋到我的電腦來
然後使用者會從網頁查詢相關的統計資料等等...

很簡單的需求吧!!
小弟之前都是使用C++或JAVA來取得資料,
(依據機台廠商給資料的方式不同與分析資料的複雜性不同決定使用哪種語言)
計算好結果後塞進資料庫(MariaDB),
然後網頁端用PHP讓使用者查詢,
呈現資料,

以往都能很好的運作,
這次方法失效的原因在於,
A. 資料流太龐大,一天可以到2XGB,對本公司小小PC當伺服器來說...
B. 使用者需求太多,SQL語法變化多端又很複雜,沒辦法由JAVA取得資料時預先整理好數據放進資料庫
C. 嘗試過使用者查詢網頁時,再由JAVA去資料庫撈取資料,計算完之後呈現給PHP再給使用者,只是JAVA連接MariaDB,也用了多執行緒,不知道為什麼CPU就是會吃到100%,八科核心都是
D. 不過PHP連接資料庫,再分析資料竟然可以分析出來,雖然久了點,至少不會像JAVA就吃光資源然後當在那裡
E. 最麻煩的一點,機台給的歷史資料會有可能變更,譬如一筆13:00的資料結果是A,可能幾分鐘後又給你一次修正資料結果變成AA,我問過機台的廠商,他們說那是正常的,因為只要基台覺得這次判讀結果可能有問題,他會把這次的結果資料放到機台空閒時再判讀一次...

哈哈哈哈哈哈感覺上廢話好多,小弟再這條路上還有很多需要學習的
汗汗汗

fillano iT邦超人 1 級 ‧ 2015-06-11 15:07:55 檢舉

所以您的意思是,資料進資料庫前並沒有分析,而是把資料一古腦塞進資料庫,然後在別人要看的時候即時運算?

你已經使用最新版的PHP-5.6.x並且打開opcache了嗎?

感覺你需要in memory database
但這solution很貴

TB iT邦新手 3 級 ‧ 2015-06-15 14:04:00 檢舉

fillano 大大:
是阿,資料丟進資料庫前並沒有分析,因為資料複雜度與可能改變性,
PHP是5.6.3版的,之前有開opcache,不過後來關了,因為實在太好用了,
好用到查出的不是最新資料....是之前cache的資料

TB iT邦新手 3 級 ‧ 2015-06-15 14:08:22 檢舉

these2012011 大大:
這幾天以來,公司的神前備解決這個問題了,
我們使用了 Hadoop 技術,多從倉庫搬了幾台公司爛電腦來架設,計算資料,
終於使用者不再挨挨挨了汗汗汗

我要發表回答

立即登入回答