易语言作为款主打 中文 易用 编程的开发软件。但是很多人都在批评易语言的效率。

我们今天通过 质数和计算 来看看易语言的效率到底与C++差了多少。

话不多说,这是今天的测试平台

C++部分

开发环境VC++ 2019

Release x86

代码优化为 /O2

C++代码(原本V2IDX是内联的,但是易语言不支持,为了达到一样的效果,我取消了)

其余微小差异均已忽略

代码源自知乎大神@wjhbb
原帖

#include <math.h>

#include <stdio.h>

#include <assert.h>

#include <iostream>

#include <windows.h>

#define LINT long long

LINT V2IDX(LINT v, LINT N, LINT Ndr, LINT nv) {

     return v >= Ndr ? (N / v - 1) : (nv - v);

}

LINT primesum(LINT N) {

    LINT* S;

    LINT* V;

    LINT r = (LINT)sqrt(N);

    LINT Ndr = N / r;

    assert(r  r <= N and (r + 1)  (r + 1) > N);

    LINT nv = r + Ndr - 1;

     V = new LINT[nv];

    S = new LINT[nv];

    for (LINT i = 0; i < r; i++) {

        V[i] = N / (i + 1);

    }

    for (LINT i = r; i < nv; i++) {

        V[i] = V[i - 1] - 1;

    }

    for (LINT i = 0; i < nv; i++) {

        S[i] = V[i] * (V[i] + 1) / 2 - 1;

    }

    for (LINT p = 2; p <= r; p++) {

        if (S[nv - p] > S[nv - p + 1]) {

            LINT sp = S[nv - p + 1];

            LINT p2 = p * p;

            for (LINT i = 0; i < nv; i++) {

                if (V[i] >= p2) {

                    S[i] -= p * (S[V2IDX(V[i] / p, N, Ndr, nv)] - sp);

                }

                else {

                    break;

                }

            }

        }

    }

    return S[0];

}

int main() {

    using std::cin;

    printf("请输入您要求的质数和的上限:" );

    LINT N ;

    cin >> N;

    int t = GetTickCount();

    printf("%lldn", primesum(N));

    printf("耗时(ms)%u", GetTickCount() - t);

    cin >> N;

}

易语言部分

开发环境 易语言5.9

分别比较 动态编译 静态编译(VC98Linker) 黑月编译(VC14.23Linker,C/C++方式编译)

开启快速数组访问,不插入花指令,不打乱编译结果.

代码

.版本 2



.程序集 Main



.子程序 _启动子程序, 整数型, , 本子程序在程序启动后最先执行

.局部变量 N, 长整数型

.局部变量 t, 整数型



标准输出 (, “请输入您要求的质数和的上限:”)

N = 到长整数 (标准输入 ())

t = GetTickCount ()

标准输出 (, 到文本 (Primesum (N)) + #换行符)

标准输出 (, “耗时(ms)” + 到文本 (GetTickCount () - t))

标准输入 ()

返回 (0)  ' 可以根据您的需要返回任意数值



.子程序 V2IDX, 长整数型

.参数 V, 长整数型

.参数 N, 长整数型

.参数 Ndr, 长整数型

.参数 nv, 长整数型



.如果真 (V ≥ Ndr)

    返回 (N ÷ V - 1)

.如果真结束

返回 (nv - V)

.版本 2



.子程序 Primesum, 长整数型

.参数 N, 长整数型

.局部变量 S, 长整数型, , "0"

.局部变量 V, 长整数型, , "0"

.局部变量 r, 长整数型

.局部变量 Ndr, 长整数型

.局部变量 nv, 长整数型

.局部变量 i, 长整数型

.局部变量 p, 长整数型

.局部变量 sp, 长整数型

.局部变量 p2, 长整数型



r = 求平方根 (N)

Ndr = N ÷ r





nv = r + Ndr - 1



重定义数组 (V, 假, nv)

重定义数组 (S, 假, nv)



i = 0

.判断循环首 (i < r)

    V [i + 1] = N ÷ (i + 1)

    i = i + 1

.判断循环尾 ()



i = r

.判断循环首 (i < nv)

    V [i + 1] = V [i] - 1

    i = i + 1

.判断循环尾 ()



i = 0

.判断循环首 (i < nv)

    S [i + 1] = V [i + 1] × (V [i + 1] + 1) ÷ 2 - 1

    i = i + 1

.判断循环尾 ()



p = 2

.判断循环首 (p ≤ r)

    .如果真 (S [nv - p + 1] > S [nv - p + 2])

        sp = S [nv - p + 2]

        p2 = p × p

        i = 0

        .判断循环首 (i < nv)

            .如果 (V [i + 1] ≥ p2)

                S [i + 1] = S [i + 1] - p × (S [V2IDX (V [i + 1] ÷ p, N, Ndr, nv) + 1] - sp)

            .否则

                跳出循环 ()

            .如果结束

            i = i + 1

        .判断循环尾 ()

    .如果真结束

    p = p + 1

.判断循环尾 ()

返回 (S [1])

UP翻译的代码不是很好,欢迎大家指正.

PS:GetTickCount()得到的时间差可能不会很准.,同时我也承认这样比较方法的不严谨性,所以测试结果仅供参考.

顺带提一下电脑CPU是i7-7700k
![
​可以发现C++的体积是最小的(易语言动态编译的还要带几个支持库文件)
][2]

Last modification:December 20th, 2020 at 03:15 pm