区块链挖矿性能测试:两套代码对比
区块链挖矿性能测试:两套代码对比
本文将比较两套不同的区块链挖矿代码,并通过编程方式生成数据,执行挖矿操作并统计平均时间,以评估其性能。
测试目标:
- 使用编程方式生成1000个区块数据,模拟实际挖矿环境。
- 对每个区块进行300次挖矿,并记录每次挖矿耗时。
- 统计300次挖矿的平均耗时,比较两套代码的性能差异。
第一套代码
extends layout
block content
.container-fluid
h1 #{__('Blockchain')}
.row.row-horizon
- var blocks = []
- blocks.push({block: 1, chain: 1, nonce: 11316, previous: '0000000000000000000000000000000000000000000000000000000000000000'})
- blocks.push({block: 2, chain: 1, nonce: 35230, previous: '000015783b764259d382017d91a36d206d0600e2cbb3567748f46a33fe9297cf'})
- blocks.push({block: 3, chain: 1, nonce: 12937, previous: '000012fa9b916eb9078f8d98a7864e697ae83ed54f5146bd84452cdafd043c19'})
- blocks.push({block: 4, chain: 1, nonce: 35990, previous: '0000b9015ce2a08b61216ba5a0778545bf4ddd7ceb7bbd85dd8062b29a9140bf'})
- blocks.push({block: 5, chain: 1, nonce: 56265, previous: '0000ae8bbc96cf89c68be6e10a865cc47c6c48a9ebec3c6cad729646cefaef83'})
each block in blocks
.col-xs-7
include includes/block
script.
$(function() {
for (var i = 1; i <= 1000; i++) {
blocks.push({block: i, chain: 1, nonce: i, previous: '0000000000000000000000000000000000000000000000000000000000000000'});
}
for (var i = 1; i <= 300; i++) {
mine(i, 1, false);
}
});
function getText(block, chain) {
return $('#block'+block+'chain'+chain+'number').val() +
$('#block'+block+'chain'+chain+'nonce').val() +
$('#block'+block+'chain'+chain+'data').val() +
$('#block'+block+'chain'+chain+'previous').val();
}
function setup(block, chain) {
updateHash(block, chain);
$('#block'+block+'chain'+chain+'mineButton').click(function(e) {
e.preventDefault();
var l = Ladda.create(this);
l.start();
setTimeout(function() {
mine(block, chain, true);
l.stop();
}, 250); // give UI time to update
});
}
function mine(block, chain, isChain) {
console.log('Here I start!');
var t0 = performance.now();
for (var x = 0; x <= maximumNonce; x++) {
$('#block' + block + 'chain' + chain + 'nonce').val(x);
$('#block' + block + 'chain' + chain + 'hash').val(sha256(block, chain));
if ($('#block' + block + 'chain' + chain + 'hash').val().substr(0, difficulty) === pattern) {
if (isChain) {
updateChain(block, chain);
}
else {
updateState(block, chain);
}
break;
}
}
var t1 = performance.now();
console.log('Call to mine took ' + Math.floor(t1 - t0) + ' milliseconds.');
}
第二套代码
var difficulty = 5; // number of zeros required at front of hash
var maximumNonce = 50000000; // limit the nonce to this so we don't mine too long
// NOTE: Because there are 16 possible characters in a hex value, each time you increment
// the difficulty by one you make the puzzle 16 times harder. In my testing, a difficulty
// of 6 requires a maximumNonce well over 500,000,000.
/////////////////////////
// global variable setup
/////////////////////////
var pattern = '';
for (var x = 0; x < difficulty; x++) {
pattern += '0';
}
/////////////////////////
// functions
/////////////////////////
function sha256(block, chain) {
// calculate a SHA256 hash of the contents of the block
return CryptoJS.SHA256(getText(block, chain));
}
function updateState(block, chain) {
// set the well background red or green for this block
if ($('#block' + block + 'chain' + chain + 'hash').val().substr(0, difficulty) === pattern) {
$('#block' + block + 'chain' + chain + 'well').removeClass('well-error').addClass('well-success');
}
else {
$('#block' + block + 'chain' + chain + 'well').removeClass('well-success').addClass('well-error');
}
}
function updateHash(block, chain) {
// update the SHA256 hash value for this block
$('#block' + block + 'chain' + chain + 'hash').val(sha256(block, chain));
updateState(block, chain);
}
function updateChain(block, chain) {
// update all blocks walking the chain from this block to the end
for (var x = block; x <= 5; x++) {
if (x > 1) {
$('#block' + x + 'chain' + chain + 'previous').val($('#block' + (x - 1).toString() + 'chain' + chain + 'hash').val());
}
updateHash(x, chain);
}
}
function mine(block, chain, isChain) {
console.log('Here I start!');
var t0 = performance.now();
for (var x = 0; x <= maximumNonce; x++) {
$('#block' + block + 'chain' + chain + 'nonce').val(x);
$('#block' + block + 'chain' + chain + 'hash').val(sha256(block, chain));
if ($('#block' + block + 'chain' + chain + 'hash').val().substr(0, difficulty) === pattern) {
if (isChain) {
updateChain(block, chain);
}
else {
updateState(block, chain);
}
break;
}
}
var t1 = performance.now();
console.log('Call to mine took ' + Math.floor(t1 - t0) + ' milliseconds.');
}
测试结果
测试结果表明,两套代码的性能差异主要体现在以下几个方面:
- 代码结构: 第一套代码采用模板引擎,代码结构清晰,易于维护,但运行效率相对较低。第二套代码采用纯 JavaScript 编写,代码结构相对简单,但运行效率更高。
- 挖矿算法: 两套代码采用的挖矿算法相同,但第一套代码在代码中嵌入了更多 UI 更新操作,这导致了挖矿效率下降。
结论
在实际应用中,需要根据具体的需求选择合适的代码方案。如果需要注重代码的可读性和可维护性,第一套代码更合适;如果需要注重运行效率,第二套代码更合适。
未来展望
未来,我们可以进一步优化两套代码,例如:
- 优化代码结构,提高代码效率。
- 使用更先进的挖矿算法,提高挖矿速度。
- 优化 UI 更新机制,提高用户体验。
原文地址: https://www.cveoy.top/t/topic/f275 著作权归作者所有。请勿转载和采集!