易语言作为款主打 中文 易用 编程的开发软件。但是很多人都在批评易语言的效率。
我们今天通过 质数和计算 来看看易语言的效率到底与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]
Comment here is closed