易语言效率与C++究竟差多少(质数和计算)
2021-08-13 08:10
981 查看
易语言作为款主打 中文 易用 编程的开发软件。但是很多人都在批评易语言的效率。 我们今天通过 质数和计算 来看看易语言的效率到底与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("%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尝试发现原因,觉得可能是一下几点
- UP技术太垃圾翻译了
- UP主的盗版易语言的暗装没清干净
- 易语言的数组只支持到INT的成员数
- 易语言的数值转换问题
请大神们看看是什么情况.UP也不好妄下定论。
但是起码证明了一点,没有不好的编程语言,只有效率低下的算法,在1亿以内易语言还是有准确性的.如果其他编程语言用的算法比易语言低效,那也不见的比易语言快的.(UP用的算法也不一定是最快的算法).易语言作为一个怡情使用的开发软件还是很不错的. 听说易语言创始人吴涛将要为他的火山开发平台添加PC端的开发功能,让我们拭目以待.(UP在考虑要不要要火山上补个票)
相关文章推荐
- C++ 笔试题简单练习----求N 以内质数 和 计算多少对质数等于N
- C++的速度比Java快2.1%:来自计算100万以内质数的实验数据对比
- 在C++中一个类对象究竟占用多少内存
- 【c++程序】任意给两个日期,计算相差多少天和各自星期几
- 计算最少出列多少位同学,使得剩下的同学排成合唱队形(C++)
- 小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数)。没多久,他就得到另一组连续正数和为100的序列:18,19,20,21,22。现在把问题交给你,你能不能也很快的找出所有和为S的连续正数序列? Good Luck!
- 【C++习作】用多态计算一百以内的质数
- c++作业计算某年某月有多少天,个人所得税计算器,利息计算器
- 计算2到10万有多少个素数(质数)
- int和double究竟占多少个字节?c++等
- pgdac和unidac插入效率究竟差多少?
- java 质数计算不同效率对比
- 百度DMLC分布式深度机器学习开源项目(简称“深盟”)上线了如xgboost(速度快效果好的Boosting模型)、CXXNET(极致的C++深度学习库)、Minerva(高效灵活的并行深度学习引擎)以及Parameter Server(一小时训练600T数据)等产品,在语音识别、OCR识别、人脸识别以及计算效率提升上发布了多个成熟产品。
- Spark对比MapReduce究竟提高了多少效率?
- 小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数)。没多久,他就得到另一
- 在C++中一个类对象究竟占用多少内存
- 百度DMLC分布式深度机器学习开源项目(简称“深盟”)上线了如xgboost(速度快效果好的Boosting模型)、CXXNET(极致的C++深度学习库)、Minerva(高效灵活的并行深度学习引擎)以及Parameter Server(一小时训练600T数据)等产品,在语音识别、OCR识别、人脸识别以及计算效率提升上发布了多个成熟产品。
- 1、请编写函数foo(int x, int y, int n) 计算:随机生成x个大小为[1,y]的正整数,它们的和为n的概率是多少?语言仅限于PHP、C/C++、Java中的一种。
- 蓝桥杯 C++ 计算出生到现在已经过了多少天
- C++ 嵌入汇编程序提高计算效率