递归火山软件开发平台

标题: 火山-交换变量()执行速度可否再加速? [打印本页]

作者: 呵呵仙8    时间: 2023-8-3 00:41
标题: 火山-交换变量()执行速度可否再加速?
测试一百万次交换文本型花了766毫秒
易语言的测试一亿次交换文本型花了516毫秒
一百万??一亿??同是C的子孙,为何差别这么大!?


作者: 朕的    时间: 2023-8-3 01:55
谁没吊事会用到这个命令这么多次,应该优化你的设计思路
作者: b0y    时间: 2023-8-3 04:28
朕的 发表于 2023-8-3 01:55
谁没吊事会用到这个命令这么多次,应该优化你的设计思路

楼主现在不就用到了....  
总有需要用的时候
作者: 创世魂    时间: 2023-8-3 07:07
本帖最后由 创世魂 于 2023-8-3 07:10 编辑

编译发布版,另外确实没人闲着没事调用这么多次。。这也不是什么高频高密集的方法。
作者: amwji    时间: 2023-8-3 07:46
还不是想火山越来越好,解决提升才是出路
作者: 呵呵仙8    时间: 2023-8-3 07:50
创世魂 发表于 2023-8-3 07:07
编译发布版,另外确实没人闲着没事调用这么多次。。这也不是什么高频高密集的方法。 ...

什么叫调用这么多次?赋值不是一直要用??交换指针是一个程序高效目的哦!!
作者: Xelloss0618    时间: 2023-8-3 08:05
呵呵仙8 发表于 2023-8-3 07:50
什么叫调用这么多次?赋值不是一直要用??交换指针是一个程序高效目的哦!! ...

火山的交换变量并不是交换指针,而是创建一个临时变量保存变量1的值,将变量2赋值给变量1,再把临时变量赋值给变量2。
再加上火山的文本型是一个C++类,效率不会高。
作者: shuimiao    时间: 2023-8-3 10:34
Xelloss0618 发表于 2023-8-3 08:05
火山的交换变量并不是交换指针,而是创建一个临时变量保存变量1的值,将变量2赋值给变量1,再把临时变量 ...

为什么火山不搞成交换指针呢?技术无法实现?
作者: fengshangren    时间: 2023-8-3 12:22
火山要交换指针,得用汇编来实现的吧
作者: 朕的    时间: 2023-8-3 16:37
呵呵仙8 发表于 2023-8-3 07:50
什么叫调用这么多次?赋值不是一直要用??交换指针是一个程序高效目的哦!! ...

如果一个子程序需要这么几亿次交换变量的写法,说明你的设计思路绝对有问题
作者: 呵呵仙8    时间: 2023-8-3 17:54
朕的 发表于 2023-8-3 16:37
如果一个子程序需要这么几亿次交换变量的写法,说明你的设计思路绝对有问题 ...

好像有道理,又好像没道理。到底应不应觉得你有道理呢?
作者: qaz2428119    时间: 2023-8-3 21:47
shuimiao 发表于 2023-8-3 10:34
为什么火山不搞成交换指针呢?技术无法实现?

易语言的文本型变量是单纯的一个整数指针,火山是一个类,
而易语言的交换变量只是把一个指针交换给另一个指针,交换变量只是为了实现交换指针
火山根本就没必要使用此类功能,就因为是类的原因,
除非你只是想单纯的实现交换类指针,不然不会比易语言快
作者: 呵呵仙8    时间: 2023-8-3 22:01
qaz2428119 发表于 2023-8-3 21:47
易语言的文本型变量是单纯的一个整数指针,火山是一个类,
而易语言的交换变量只是把一个指针交换给另一个 ...

所以,火山的变量不是由堆栈指针(整数或长整数)构成变量.而是由不知多~长的字节构成的堆栈指针?还真的很创新嘛!!难怪构建个自定义结构,会这也不能,那也不能.看例子就像天书一样!!
作者: qaz2428119    时间: 2023-8-4 09:53
呵呵仙8 发表于 2023-8-3 22:01
所以,火山的变量不是由堆栈指针(整数或长整数)构成变量.而是由不知多~长的字节构成的堆栈指针?还真的很创 ...

堆栈不堆栈我不知道,我知道的是 火山以类为主,所以就没有结构,而且又不支持包装类型,只支持封装代码,而且还不支持指针,这就是火山,也是火山所面向的用户(小白)

官方人员都是这么说,你既然不学C++就不要搞封装,就老老实实的用别人封装好的
作者: 小蜗牛    时间: 2023-8-4 10:02
本帖最后由 小蜗牛 于 2023-8-4 10:04 编辑
Xelloss0618 发表于 2023-8-3 08:05
火山的交换变量并不是交换指针,而是创建一个临时变量保存变量1的值,将变量2赋值给变量1,再把临时变量 ...

这样啊,我以为是交换指针呢...看来除了基础类型能方便一点,其它类型还是少用...
作者: shuimiao    时间: 2023-8-4 11:22
qaz2428119 发表于 2023-8-3 21:47
易语言的文本型变量是单纯的一个整数指针,火山是一个类,
而易语言的交换变量只是把一个指针交换给另一个 ...

就是想单纯交换类指针啊,又不需要对类做任何改动
作者: yhobo    时间: 2023-8-4 16:04
前段时间换上这个命令,确实快了非常多....那么多年竟然不知道..而且我发现不少人都不知道..
作者: weilai    时间: 2023-8-4 23:17
还有这个命令,还以为只能 c=a   a=b  b=c这样交换变量
作者: qaz2428119    时间: 2023-8-5 11:07
shuimiao 发表于 2023-8-4 11:22
就是想单纯交换类指针啊,又不需要对类做任何改动

火山的文本是一个类,非直接数据指针,也就是文本数据指针是藏在类里的,好像没提供接口可以直接改变这个指针
作者: 水常流    时间: 2023-8-5 11:11
朕的 发表于 2023-8-3 16:37
如果一个子程序需要这么几亿次交换变量的写法,说明你的设计思路绝对有问题 ...

还真有,还有比这更大的,比如双色球
作者: 793359277    时间: 2023-8-5 13:39
本帖最后由 793359277 于 2023-8-5 20:36 编辑
qaz2428119 发表于 2023-8-5 11:07
火山的文本是一个类,非直接数据指针,也就是文本数据指针是藏在类里的,好像没提供接口可以直接改变这个指 ...

取文本指针()
置文本指针()
取变量地址(文本变量)  变量地址+变整数大小*7内的值 即为文本指针地址

作者: qaz2428119    时间: 2023-8-5 14:16
793359277 发表于 2023-8-5 13:39
取文本指针()
置文本指针()
取变量地址(文本变量)  变量地址+变整数大小*8内的值 即为文本指针地址

还真没研究这些,你说的如果是真,那表面你认真研究了
作者: 朕的    时间: 2023-8-5 16:57
水常流 发表于 2023-8-5 11:11
还真有,还有比这更大的,比如双色球

绝对是写法有问题,没明白交换变量的真实用意和使用场景
作者: Xelloss0618    时间: 2023-8-5 17:06
793359277 发表于 2023-8-5 13:39
取文本指针()
置文本指针()
取变量地址(文本变量)  变量地址+变整数大小*8内的值 即为文本指针地址

置文本指针会复制文本数据的,另外指针偏移取文本指针可能不准,因为文本型内部可能有一个字节集类
作者: 793359277    时间: 2023-8-5 20:12
本帖最后由 793359277 于 2023-8-5 21:24 编辑
Xelloss0618 发表于 2023-8-5 17:06
置文本指针会复制文本数据的,另外指针偏移取文本指针可能不准,因为文本型内部可能有一个字节集类 ...

piv线程池对象类创建大概率失败并且会伴随崩溃,很奇怪,啥时候修复一下,利快云有私信
作者: 793359277    时间: 2023-8-5 20:36
本帖最后由 793359277 于 2023-8-5 21:44 编辑
qaz2428119 发表于 2023-8-5 14:16
还真没研究这些,你说的如果是真,那表面你认真研究了

这里可以看出文本型在内存中是占了11*变整数大小的长度的 比如这个64位程序,调试输出 (取数据类型尺寸 (文本型)),会返回88 (11*8),那文本指针在变量地址+7*8处,取文本指针取的就是这个地方的值 (之前打错了打成*8),并且9*8处是文本长度(这里尾部额外带2个0),字节集类的长度的是7*8 ,+3*8处是字节集指针,+5*8是字节集长度(尾部多一个0)


(, 下载次数: 20)

作者: 呵呵仙8    时间: 2023-8-5 20:39
朕的 发表于 2023-8-5 16:57
绝对是写法有问题,没明白交换变量的真实用意和使用场景

真实用意和使用场景,就是要快.快速的交换堆栈指针.无需用三个变量去多次申请堆栈,复制字节集,释放堆栈!!直接就两个变量的堆栈指针交换!交换指针,多数用于数据排序算法!EXE和DLL传参交互,等!所以,能提升0.001秒那是质的飞越!
作者: 793359277    时间: 2023-8-5 22:02
qaz2428119 发表于 2023-8-5 14:16
还真没研究这些,你说的如果是真,那表面你认真研究了

(, 下载次数: 22)

作者: Xelloss0618    时间: 2023-8-5 22:45
793359277 发表于 2023-8-5 20:12
piv线程池对象类创建大概率失败并且会伴随崩溃,很奇怪,啥时候修复一下,利快云有私信 ...

把你的例子发给我看看
作者: weilai    时间: 2023-8-5 23:01
呵呵仙8 发表于 2023-8-5 20:39
真实用意和使用场景,就是要快.快速的交换堆栈指针.无需用三个变量去多次申请堆栈,复制字节集,释放堆栈!! ...

这个是不可能实现的,要知道火山pc是c++,而c是速度最快的,想要排序交换变量(文本等对象类型的直接取数据指针就行),然后相当于就是直接操作整数或长整数,速度肯定是无与伦比的,交换变量不想用3个变量直接位运算异或就行 ,再加上c++编译器强大的优化能力,保证会比易语言快的多。所以完全不用纠结这个交换变量速度的快慢,这个完全就是可有可无的一个命令
作者: numbersir    时间: 2023-8-5 23:04
看来过度封装都会多耗时间一点
作者: 793359277    时间: 2023-8-5 23:29
Xelloss0618 发表于 2023-8-5 22:45
把你的例子发给我看看

奇怪了,我那天也是这样的代码,但是经常因为创建失败直接导致崩溃,下边的代码都没机会执行就蹦了,偶尔创建失败还执行完取最后错误,错误也是0,你可以看下私信。今天测试居然是正常的

(, 下载次数: 20)


作者: Xelloss0618    时间: 2023-8-6 08:36
793359277 发表于 2023-8-5 23:29
奇怪了,我那天也是这样的代码,但是经常因为创建失败直接导致崩溃,下边的代码都没机会执行就蹦了,偶尔 ...

之前创建失败可能是系统资源(内存、句柄等)不足,大概你之前执行的程序有句柄或内存泄漏。
现在电脑重启了,那就正常了。
私信没看到,可能丢失数据了。
作者: qaz2428119    时间: 2023-8-7 15:37
呵呵仙8 发表于 2023-8-5 20:39
真实用意和使用场景,就是要快.快速的交换堆栈指针.无需用三个变量去多次申请堆栈,复制字节集,释放堆栈!! ...

交换变量指针 还牵扯到一个问题,指针的申请与释放的问题,不同语言指针的申请可能使用的不是同一堆,释放就会导致问题




欢迎光临 递归火山软件开发平台 (https://bbs.voldp.com/) Powered by Discuz! X3.4