欢迎光临散文网 会员登陆 & 注册

易语言效率与C++究竟差多少(质数和)

2020-07-21 17:05 作者:风的彷徨  | 我要投稿

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

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

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

C++部分

开发环境VC++ 2019

Release x86

代码优化为 /O2

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

其余微小差异均已忽略

代码源自知乎大神@wjhbb

原帖:https://www.zhihu.com/question/29580448

#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("%lld\n", 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++的体积是最小的(易语言动态编译的还要带几个支持库文件)


先从一亿以内的质数开始

可以发现他们之间的速度差距

当我们提高计算量时,我们会惊人的发现 易语言程序算错了

例如知乎上的10亿

易语言算的慢也就算了,关键还是不精确的

UP尝试发现原因,觉得可能是一下几点

1,UP技术太垃圾翻译错了

2,UP主的盗版易语言的暗装没清干净

3,易语言的数组只支持到INT的成员数

4,易语言的数值转换问题


请大神们看看是什么情况.UP也不好妄下定论。


但是起码证明了一点,没有不好的编程语言,只有效率低下的算法,在1亿以内易语言还是有准确性的.如果其他编程语言用的算法比易语言低效,那也不见的比易语言快的.(UP用的算法也不一定是最快的算法).易语言作为一个怡情使用的开发软件还是很不错的.


听说易语言创始人吴涛将要为他的火山开发平台添加PC端的开发功能,让我们拭目以待.(UP在考虑要不要要火山上补个票)

易语言效率与C++究竟差多少(质数和)的评论 (共 条)

分享到微博请遵守国家法律