Dria

Swan
NFTHardhat
21,000 USDC
View results
Submission Details
Severity: low
Invalid

`Statistics::variance()` and `Statistics::avg()` gas optimizations

Summary

Statistics::variance() and Statistics::avg() functions can be gas optimized. Caching data.length and only accessing it once will reduce repetitive data.length calls and the diff definition can be completely removed.

Vulnerability Details

variance and avg calculations can be optimized. In both Statistics::variance() and Statistics::avg() functions accessing data.length in each iteration is costly. Caching it in a variable uint256 len = data.length; will save gas. In Statistics::variance() function the diff definition can be removed. Removing diff altogether or computing inline can be a little more gas-efficient since it avoids the extra stack operation to save diff on each iteration.

Impact

Without the suggested optimizations the executions of these function will cost more gas.

Tools Used

Manual audit

Recommendations

function avg(uint256[] memory data) internal pure returns (uint256 ans) {
uint256 sum = 0;
+ uint256 len = data.length;
- for (uint256 i = 0; i < data.length; i++) {
+ for (uint256 i = 0; i < len; i++) {
sum += data[i];
}
- ans = sum / data.length;
+ ans = sum / len;
}
function variance(uint256[] memory data) internal pure returns (uint256 ans, uint256 mean) {
mean = avg(data);
uint256 sum = 0;
+ uint256 len = data.length;
- for (uint256 i = 0; i < data.length; i++) {
+ for (uint256 i = 0; i < len; i++) {
- uint256 diff = data[i] - mean;
- sum += diff * diff;
+ sum += (data[i] - mean) * (data[i] - mean);
}
- ans = sum / data.length;
+ ans = sum / len;
}
Updates

Lead Judging Commences

inallhonesty Lead Judge 9 months ago
Submission Judgement Published
Invalidated
Reason: Non-acceptable severity

Support

FAQs

Can't find an answer? Chat with us on Discord, Twitter or Linkedin.