文本首发bIlibilicnblogs为作者补发,如在其他平台看见本文,均为经允许的盗窃

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

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

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

  1. C++部分
  2. 开发环境VC++ 2019
  3. Release x86
  4. 代码优化为 /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("%lld\n", primesum(N));
printf("耗时(ms)%u", GetTickCount() - t);
cin >> N;
}

易语言部分

  1. 开发环境 易语言5.9
  2. 分别比较 动态编译 静态编译(VC98Linker) 黑月编译(VC14.23Linker,C/C++方式编译)
  3. 开启快速数组访问,不插入花指令,不打乱编译结果.
​.版本 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在考虑要不要要火山上补个票)

最新文章

  1. window.top.location.href 和 window.location.href 的区别
  2. 【原创】Kafka producer原理 (Scala版同步producer)
  3. [转]Python 命令行参数和getopt模块详解
  4. LeetCode 3Sum Smaller
  5. Saiku 下载,安装
  6. redis基本命令的演示:
  7. Ubuntu14.04LST 安装Oracle SQL Developer 4.0.2
  8. .net mvc笔记1_ The MVC Pattern
  9. Windos系统git提交
  10. UESTC 1591 An easy problem A【线段树点更新裸题】
  11. 不能直接获取?聊聊如何在Shader Graph中获取深度图
  12. 使用make
  13. 使用Roslyn脚本化C#代码,C#动态脚本实现方案
  14. 同一个菜品商家中心和erp价格显示不一致解决方案FAQ
  15. cf1076d 贪心最短路
  16. springboot2.0集成shiro出现ShiroDialect报错找不到AbstractTextChildModifierAttrPr
  17. mybatis plus XML文件如何使用多个where条件
  18. WPF 矩形框8个控制点伸缩及拖拽
  19. Java -- JDBC 学习--批量处理
  20. document.write : 什么是在html输出中使用,什么是文档加载后使用?

热门文章

  1. Jenkins CI&amp;CD 自动化发布项目实战(下篇)
  2. bootstrap validate 验证插件
  3. 前端集合传参,springmvc后端如何接收
  4. [心得体会]SpringMVC源码分析
  5. 1shell变量的作用域
  6. sublime最全笔记
  7. python04篇 文件操作(二)、集合
  8. 数据库里的回车字符导致取过来的json字符串不规范的问题
  9. 基于SSM框架的旅游网站
  10. Scala学习——基础入门