易语言效率与C++究竟差多少(质数和计算)
易语言作为款主打 中文 易用 编程的开发软件。但是很多人都在批评易语言的效率。
我们今天通过 质数和计算 来看看易语言的效率到底与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++究竟差多少(质数和计算)的更多相关文章
- 执行效率做比较,Go、python、java、c#、delphi、易语言等
比较环境,在win7 64位,比较各种语言的整数型运算,下面的比较只作为单项比较.具体方式,40000*40000遍历相加.为了防止编译器优化,生成一个随机数. 1:c#,在NET2.0框架下作为 ...
- C++ 编写DLL文件给易语言调用
摸索了两天了,终于解决了所有问题,在此跟大家分享. 需要三个文件,dll_demo.h.dll_demo.cpp.dll_dome.def 直接上代码: 头文件如下: #ifndef _DLL_DEM ...
- 在易语言中调用MS SQL SERVER数据库存储过程方法总结
Microsoft SQL SERVER 数据库存储过程,根据其输入输出数据,笼统的可以分为以下几种情况或其组合:无输入,有一个或多个输入参数,无输出,直接返回(return)一个值,通过output ...
- 易语言5.6 精简破解版[Ctoo]
说明:本易语言5.6破解版 加入了[E剑终情]大神制作的完美通杀补丁,本人还修复了静态编译的问题. 关于静态编译失效的问题,大家解压之后会看到易语言根目录有一个"易言语静态编译配置工具&qu ...
- 易语言软件加VMProtect壳的正确方法
VMP是一款很强大的加密壳,代码虚拟化技术可以很好的保护程序不被恶意修改破J但是很多人不知道怎么给自己的程序加壳,今天给大家晋级下加壳的正确方法 相信很多新手都以为只要把软件直接拖到VMP里重新编译一 ...
- Windows2003/2008/2008 R2下易语言点支持库配置就退出的问题
问题: 请问一个问题,我的电脑上win2003系统的,安装了易语言后,一点支持库配置就会自动退出.这是为什么啊? 解决方法如下: 删除 lib下的wmp.npk,重新打开易语言就可以了.
- 易语言转C#小试牛刀
呵呵,用了几年的易语言,太郁闷了,玩过E的童鞋们懂得,偶然机会尝试C#,现正式投入C#门下. 我会把我学习C#的一些知识和重点,实时发不到我的BLOG中,同想学习C#的童鞋一起成长起来.
- 幻世(OurDream)2D图形引擎易语言汉化版更新提示
幻世引擎的易语言汉化专版到目前为止已经累积了多个BUG,其中多个BUG是影响引擎功能使用的问题,我将会在近期发布修复所有问题的更新版本(此更新版本同时也将会支持最新的对加入的粒子系统的支持),敬请各位 ...
- 易语言 【寻找文本】命令的bug
最近在重写易语言模块的时候,在取子文本操作时老是出错,经常出现一些奇怪的问题,一开始以为是代码问题,可是找半天硬是找不到问题所在. 于是进入了找bug模式,这么几行代码,看了我半个小时,左改右改,总感 ...
随机推荐
- 『心善渊』Selenium3.0基础 — 20、Selenium对Cookie的操作
目录 1.Cookie介绍 2.Session介绍 3.Cookie工作原理图解 4.Cookie内容参数说明 5.Selenium操作Cookie的API 6.Selenium操作Cookie的示例 ...
- SQL反模式读书笔记思维导图
在写SQL过程以及设计数据表的过程中,我们经常会走一些弯路,会做一些错误的设计.<SQL反模式>这本书针对这些经常容易出错的设计模式进行分析,解释了错误的理由.允许错误的场景,并给出更好的 ...
- CentOS-磁盘扩容挂载目录
挂载 查看存储情况 $ df -kh 查看磁盘情况 $ fdisk -l fdisk创建分区(注:可操作存储上限为2TB)$ fdisk /dev/sdb根据提示,依次输入"n", ...
- SpringBoot | 1.2 全注解下的Spring IoC
前言 在学习SpringBoot之前,有几个Spring的重要的基础概念需要提一下,SpringBoot对这些基础概念做进一步的封装,完成自动配置.首先就是Spring的控制反转IOC,由于Sprin ...
- Java中的自增自减
情况①: for (int i = 0; i < 100; i++) { j = 1 + j++; } System.out.println(j); 结果是 0 !! 这是由于在进行后自增/自减 ...
- linux学习之路第七天(压缩和解压类指令详解)
压缩和解压类 1.gzip/gunzip 指令 gzip 指令用于压缩文件, gunzip用于解压的 基本语法 gzip 文件 (功能描述:压缩文件,指令将文件压缩成*.gz文件) gunzip 文件 ...
- Could not connect to 'xxx.xx.xx.xxx' (port 22): Connection failed.
刚刚使用xshell好好的,突然注销账号,准备重新连接突然连不上了. 这就很尴尬了,对我这种linux菜鸟只能去百度了,终于解决了,赶紧记录下这个坑 1.先登陆虚拟机,输入这段命令 查看ssh服务是否 ...
- npm run start失败&Node.js 查询指定端口运行情况及终止占用端口办法
缘由: node.js项目中运行npm run start命令脚本报错,No such file or directory 最开始以为是命令脚本找不到所谓的执行路径,但后面发现不是,是package. ...
- Selenium启动Chrome浏览器提示“请停用以开发者模式运行的扩展程序”的解决办法
安装了python selenium,运行下面代码: 1 from selenium import webdriver 2 3 browser = webdriver.Chrome() 4 brows ...
- 【网络IO系列】 预备知识 操作系统之内核程序和用户程序
一.概念 首先我们先来复习一下操作系统的概念和作用 操作系统是用户和硬件之间的一层媒介程序,为上提供编程接口,为下调用资源,管理驱动,以使用硬件. 从以上的表述我们可以看出OS的两点作用,第一个是对下 ...