在重負載測試中測量一組事務的部署時間
我目前正在嘗試對 ERC20 令牌執行重負載測試。我的計劃是使用 truffle 來測試一些東西,比如部署 500 個傳輸交易需要多長時間(在私有區塊鏈上)、每秒最大交易數量,以及理想情況下通過包含來自多個節點的交易來測試可擴展性。下面是我執行 500 個事務的程式碼
const EnergyToken = artifacts.require("EnergyToken"); const assert = require('assert'); const truffleAssert = require('truffle-assertions'); const { performance } = require('perf_hooks'); const numberOfTransactions = 200; contract("Energy Token Test3 ", async accounts => { it("send $numberOfTransactions transactions from account 0 to account 1", async () => { let contract = await EnergyToken.at("0x5BbD383bD43aC3896B86207eFe88cf0628ad06F0"); for (let i = 1; i < 1 + numberOfTransactions; i++) { let t0 =performance.now(); contract.transfer.sendTransaction(accounts[1],1,{from: accounts[0]}); let t1 = performance.now(); console.log("Transaction " + i + " ***** From:" + accounts[0] + " ***** To: " + accounts[1] + "took " + (t1-t0) + " ms" ); } });
問題是,現在我正在測量送出這些事務所需的時間,而不是它們的部署速度。我之前嘗試過使用 await ,
contract.transfer
但隨後交易被 1 比 1 處理(每個塊 1 tx),這也需要大量時間。我的問題是是否有更好的方法來測量時間?
我的問題是是否有更好的方法來測量時間?
我懷疑存在概念上的脫節。這不是同步操作,時間取決於比這裡考慮的更多因素。此外,如果這樣做,快速交易可能會導致生產麻煩。
網路吞吐量
是的,您正在衡量流程迭代和送出交易的時間。處理交易的網路時間取決於其他因素:
- gasPrice (未指定,但可以與
{gasPrice: bid}
)- 網路擁塞
- 網路區塊gasLimit(區塊承載能力)
充其量,您可以測量給定時間點的交易確認時間。
gasPrice
它與您的循環解耦 -在特定時間(網路條件)給定 a 或多或少相同,除非網路變得飽和,可能是因為您的積極送出。此外,您會發現它更適合在曲線上測量。來源:https ://www.ethgasstation.info/index.php (向下滾動)
擴展建議
這些建議與您的問題相鄰,以使遇到此文章的其他人受益。
- **解決失去/失敗的情況。**成功並不能保證——例如,天然氣定價錯誤。失去/失敗的交易可能會堵塞整個隊列,因為來自給定帳戶的交易保證以隨機數順序進行探勘。重新送出或取消,這樣生活才能繼續。
- **考慮速率限制。**您自己的交易可能會成為網路擁塞的根源,這可能會導致未來區塊中的 gasPrices 增加,並可能導致 gas 定價錯誤。請記住,有一個有限的區塊 gasLimit,如果您真的很認真,可以將其填滿,但維持它會非常昂貴。
在這裡查看:帳戶隨機數的並發模式
很有可能從測試網獲得非常誤導性的資訊,其中交易基本上是免費的,網路使用率遠低於主網。
希望能幫助到你。
您可以測量從創建到它出現在區塊鏈上所花費的交易時間。
創建事務後,您將使用數據庫中的雜湊記錄時間。當交易被探勘時,您記錄塊時間戳。
您還可以測量其他時間,例如交易第一次出現在待處理池中。
正如 Rob 所說,有許多參數會影響結果。像塊氣體限制、網路使用、伺服器容量、探勘時間(對於 PoW 是一個隨機過程)。