Simpe循环平方整数值在C中比在PHP中慢

2024-09-30 23:37:38 发布

您现在位置:Python中文网/ 问答频道 /正文

昨天我看了一段很好的(短)视频,讲的是一道数字为“33”的数学题。 链接:https://www.youtube.com/watch?v=wymmCdLdPvM

简而言之:许多数字可以通过:a³ + b³ + c³来计算

例如:29 = 3³ + 1³ + 1³

(应该提到:abc可以是阴性的!)你知道吗

所以,我想我给了这个问题一个简短的暴力尝试。没什么复杂的,只是看看我计算这些值的速度有多快。你知道吗

我建立了3个程序(PHP,Pyhton和C,让我们集中在PHP和C这里),这就是我得到的。。。你知道吗

PHP程序:

#!/usr/bin/php5
<?php

$total = 0;
$aktstamp = time();

for ($a = -100000000000; $a <= 100000000000; $a++) {
    for ($b = -100000000000; $b <= 100000000000; $b++) {
        for ($c = -100000000000; $c <= 100000000000; $c++) {
            $total++;

            if ($a**3+$b**3+$c**3 == 33) {
                echo "FOUND IT! a**3+$b**3+$c**3 a: " . $a . " b: " . $b + " c: " . $c;
            }
            if ((-$a)**3+$b**3+$c**3 == 33) {
                echo "FOUND IT! (-a)**3+$b**3+$c**3 a: " . $a . " b: " . $b + " c: " . $c;
            }                   
            if ($a**3+(-$b)**3+$c**3 == 33) {
                echo "FOUND IT! a**3+(-$b)**3+$c**3 a: " . $a . " b: " . $b + " c: " . $c;
            }                   
            if ($a**3+$b**3+(-$c)**3 == 33) {
                echo "FOUND IT! a**3+$b**3+(-$c)**3 a: " . $a . " b: " . $b + " c: " . $c;
            }                   
            if ((-$a)**3+(-$b)**3+$c**3 == 33) {
                echo "FOUND IT! (-a)**3+(-$b)**3+$c**3 a: " . $a . " b: " . $b + " c: " . $c;
            }                   
            if ((-$a)**3+$b**3+(-$c)**3 == 33) {
                echo "FOUND IT! (-a)**3+$b**3+(-$c)**3 a: " . $a . " b: " . $b + " c: " . $c;
            }                   
            if ($a**3+(-$b)**3+(-$c)**3 == 33) {
                echo "FOUND IT! a**3+(-$b)**3+(-$c)**3 a: " . $a . " b: " . $b + " c: " . $c;  
            }

            if ($total % 10000000 == 0) {
                $timetaken = time() - $aktstamp;
                $calcspersec = 10000000 / $timetaken;

                $date = date("d.m.Y", time());
                $time = date("H:i:s", time());
                echo $date . " " . $time . ": " . $a . "\n";
                echo "(Calcs per sec: " . $calcspersec . ")\n";

                $aktstamp = time();         
            }
        }
    }
}
?>

和一个C程序:

/* 
Compile with: 
gcc ./33.c -o 33 -lm -O1
*/

#include <stdio.h>
#include <math.h>
#include <sys/time.h>

long long main(long long argc, char *argv[])
{
    long long total = 0, a = 0, b = 0, c = 0;
    int timetaken, calcspersec;
    int aktstamp = (int)time(NULL);

    for (a = -100000000000; a <= 100000000000; a++) {
        for (b = -100000000000; b <= 100000000000; b++) {
            for (c = -100000000000; c <= 100000000000; c++) {
                total++;

                if (pow(a, 3)+pow(b, 3)+pow(c, 3) == 33) {
                    printf("FOUND IT! pow(a, 3)+pow(b, 3)+pow(c, 3) a: %lld b: %lld c: %lld\n", a, b, c);
                }
                if (pow(-a, 3)+pow(b, 3)+pow(c, 3) == 33) {
                    printf("FOUND IT! pow(-a, 3)+pow(b, 3)+pow(c, 3) a: %lld b: %lld c: %lld\n", a, b, c);
                }                   
                if (pow(a, 3)+pow(-b, 3)+pow(c, 3) == 33) {
                    printf("FOUND IT! pow(a, 3)+pow(-b, 3)+pow(c, 3) a: %lld b: %lld c: %lld\n", a, b, c);
                }                   
                if (pow(a, 3)+pow(b, 3)+pow(-c, 3) == 33) {
                    printf("FOUND IT! pow(a, 3)+pow(b, 3)+pow(-c, 3) a: %lld b: %lld c: %lld\n", a, b, c);
                }                   
                if (pow(-a, 3)+pow(-b, 3)+pow(c, 3) == 33) {
                    printf("FOUND IT! pow(-a, 3)+pow(-b, 3)+pow(c, 3) a: %lld b: %lld c: %lld\n", a, b, c);
                }                   
                if (pow(-a, 3)+pow(b, 3)+pow(-c, 3) == 33) {
                    printf("FOUND IT! pow(-a, 3)+pow(b, 3)+pow(-c, 3) a: %lld b: %lld c: %lld\n", a, b, c);
                }                   
                if (pow(a, 3)+pow(-b, 3)+pow(-c, 3) == 33) {
                    printf("FOUND IT! pow(a, 3)+pow(-b, 3)+pow(-c, 3) a: %lld b: %lld c: %lld\n", a, b, c);
                }

                if (total % 10000000 == 0) {
                    timetaken = (int)time(NULL) - aktstamp;
                    calcspersec = 10000000 / timetaken;

                    printf("%lld\n", a);
                    printf("(Calcs per sec: %u)\n", calcspersec);

                    aktstamp = time(NULL);          
                }
            }
        }
    }
}

以下是速度:

PHP: (Calcs per sec: 2000000)
Python: (Calcs per sec: 1186440)
C: (Calcs per sec: 833333)

PHP比Python快对我来说并不奇怪。但C究竟为什么比PHP慢那么多呢?你知道吗

即使是Python也比C。。。你知道吗

我是否有一个愚蠢的错误,或者C-pow()函数比PHPs**慢得多?你知道吗

那么,有没有人明白为什么C的速度只有PHP的一半?你知道吗


Tags: echoforiftimeitlongtotalphp
2条回答

这就是解决办法!使用a*a*a而不是pow(a, 3)使程序更快。我还计算了所有三个程序版本中循环开始时的变量(这是一个悬而未决的结果,我应该考虑一下,谢谢Jaco!)。你知道吗

以下是现在的速度:

PHP: (Calcs per sec: 27.343.750)
Python: (Calcs per sec: 5.636.070)
C: (Calcs per sec: 250.000.000)

非常感谢你的帮助!你知道吗

托马斯

附言:如果我要解开这个数学之谜,我会提到你们所有人;-)

可能是因为使用pow()函数,您将long long转换为double,然后调用一个函数,然后将生成的double转换回long long,如果您编写了a*a*a,这些都是不必要的。你知道吗

相关问题 更多 >