C++ vs JavaScript prestanda
Hej
Jag sitter och leker lite med C++ vs JavaScript / NodeJS. Gjorde ett litet test där jag tänkte försöka jämföra prestanda.
Skrev ett program i C++ för att räkna fram "perfekta tal" "brute force" https://sv.wikipedia.org/wiki/Perfekt_tal. Skrev sedan motsvarande i JavaScript med samma algoritm. Testar med ex 40 000 tal, tiden det tar för C++ att räkna sig igenom detta är 5600ms. Med JavaScript gör jag samma beräkning på ca 2100ms.
Har kört "build release" på C++ i både Xcode och QT creator, men med i stort sett samma resultat. Borde det inte vara tvärtom resultatmässigt?
Någon som kan ge en vettig förklaring till detta? Antar att JavaScript optimerar på något sätt som ger denna skillnad. Har det någon med hanteringen av long int i C++ att göra? Hur skulle jag kunna få C++ att slå JavaScript för samma problem? Bifogar båda kodbaserna här under:
C++ ////////////////////////////////
#include <iostream>
#include <ctime>
using namespace std;
long divisorSum(long n);
bool isPerfect(long n);
void findPerfects(int stop);
int main() {
findPerfects(40000);
return 0;
}
long divisorSum(long n)
{
long total = 0;
for (long divisor = 1; divisor < n; divisor++) {
if (n % divisor == 0) {
total += divisor;
}
}
return total;
}
bool isPerfect(long n)
{
return (n != 0) && (n == divisorSum(n));
}
void findPerfects(int stop)
{
clock_t start, end;
start = clock();
for (long num = 1; num < stop; num++) {
if (isPerfect(num)) {
cout << "Found perfect number: " << num << endl;
}
}
end = clock();
printf("Time Cost: %lums\n", (end - start) * 1000 / CLOCKS_PER_SEC);
}
JS ///// ///// ///// /////
const { PerformanceObserver, performance } = require("perf_hooks");
function divisorSum(n) {
let total = 0;
for (let divisor = 1; divisor < n; divisor++) {
if (n % divisor == 0) {
total += divisor;
}
}
return total;
}
function isPerfect(n) {
return n !== 0 && n == divisorSum(n);
}
function findPerfects(stop) {
var t0 = performance.now();
for (let num = 1; num < stop; num++) {
if (isPerfect(num)) {
console.log(`Found perfect Number: ${num}`);
}
}
var t1 = performance.now();
console.log("Call to doSomething took " + (t1 - t0) + " ms.");
}
findPerfects(40000);