社区导航

 

搜索
查看: 330|回复: 14

[讨论] 这个速度无法理解,是否是正常的,环境是esp8266

[复制链接]

26

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2019-1-6 22:53:13 | 显示全部楼层 |阅读模式
import time,machine
machine.freq(160000000)
print(machine.freq())
time_start=time.ticks_ms()
n=0
while(n < 10000):
  n=n+1
time_end=time.ticks_ms()
print('time cost',time_end-time_start,'ms')

执行结果:
160000000
time cost 440 ms


10000的空循环耗时高达440ms



回复

使用道具 举报

26

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

 楼主| 发表于 2019-1-6 22:57:34 | 显示全部楼层
import time,machine
machine.freq(160000000)
print(machine.freq())
time_start=time.ticks_ms()
for n in range(10000):
  pass
time_end=time.ticks_ms()
print('time cost',time_end-time_start,'ms')

160000000
time cost 302 ms
这样写稍快一点,但是还是有300多ms
这速度比51用c都慢很多了


回复

使用道具 举报

7429

TA的帖子

14

TA的资源

版主

Rank: 6Rank: 6

测评达人

发表于 2019-1-7 10:09:32 | 显示全部楼层
没有这么慢吧,可能是你的固件版本较低。另外mpy的编程与传统方式不同,有它的一些特殊性,可以参考下面几个帖子:




回复

使用道具 举报

7429

TA的帖子

14

TA的资源

版主

Rank: 6Rank: 6

测评达人

发表于 2019-1-7 10:14:31 | 显示全部楼层
另外频率需要设置为168000000,而不是160000000

点评

esp8266 好像是 160000000 没错。  详情 回复 发表于 2019-1-7 11:29


回复

使用道具 举报

7429

TA的帖子

14

TA的资源

版主

Rank: 6Rank: 6

测评达人

发表于 2019-1-7 10:15:38 | 显示全部楼层
下图是在pybcnv2上的运行效果

剪贴板01.jpg




回复

使用道具 举报

7429

TA的帖子

14

TA的资源

版主

Rank: 6Rank: 6

测评达人

发表于 2019-1-7 10:25:16 | 显示全部楼层
python解释语言,速度比C慢是正常的。平均大约慢100倍左右。上面程序如果改成函数方式,还可以提高一些:
  1. >>>
  2. paste mode; Ctrl-C to cancel, Ctrl-D to finish
  3. === import time,machine
  4. === print(machine.freq())
  5. ===
  6. === def test1(n):
  7. ===     t1 = time.ticks_ms()
  8. ===     j = 0
  9. ===     cnt = range(n)
  10. ===     for i in cnt:
  11. ===         j += 1
  12. ===     t2 = time.ticks_ms()
  13. ===     return time.ticks_diff(t2, t1)
  14. ===
  15. === test1(10000)
  16. (168000000, 168000000, 42000000, 84000000)
  17. 21
  18. >>>
复制代码





回复

使用道具 举报

687

TA的帖子

0

TA的资源

纯净的硅(初级)

Rank: 4

发表于 2019-1-7 11:29:21 | 显示全部楼层
dcexpert 发表于 2019-1-7 10:14
另外频率需要设置为168000000,而不是160000000

esp8266 好像是 160000000 没错。

点评

esp8266是160M,是我看错成STM32了。  详情 回复 发表于 2019-1-7 11:32


回复

使用道具 举报

7429

TA的帖子

14

TA的资源

版主

Rank: 6Rank: 6

测评达人

发表于 2019-1-7 11:32:02 | 显示全部楼层
slotg 发表于 2019-1-7 11:29
esp8266 好像是 160000000 没错。

esp8266是160M,是我看错成STM32了。


回复

使用道具 举报

26

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

 楼主| 发表于 2019-1-7 16:04:02 | 显示全部楼层
写成函数更快是什么道理?
想想解释型慢100倍以上还算合理,8266的速度比stm32慢比较正常,程序很多都在spiflash里面,出现跳转的时候需要额外的等待时间

点评

函数方式快是micropython运行机制造成的,可以参考3楼的参考帖子。  详情 回复 发表于 2019-1-7 21:13


回复

使用道具 举报

26

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

 楼主| 发表于 2019-1-7 16:11:56 | 显示全部楼层
新测试
关闭掉wifi模块时间缩短到255ms
循环变量修改成以下模式缩短到111ms
似乎stm32的改成函数写法主要是循环范围的变更收益,方便测试一下吗

import time,machine
machine.freq(160000000)
print(machine.freq())
time_start=time.ticks_ms()
cnt=range(10000)
for n in cnt:
  pass

time_end=time.ticks_ms()
print('time cost',time_end-time_start,'ms')

点评

优化的机制也是与micropython的设计有关,上面的优化是原作者给出的,应该是目前最有效的方式。将循环体改成变量,就不用每次循环后判断一次范围,减少了判断次数,所以可以提高速度。stm32是目前主要的硬件环境,也  详情 回复 发表于 2019-1-7 21:17


回复

使用道具 举报

7429

TA的帖子

14

TA的资源

版主

Rank: 6Rank: 6

测评达人

发表于 2019-1-7 21:13:42 | 显示全部楼层
wangshujun72 发表于 2019-1-7 16:04
写成函数更快是什么道理?
想想解释型慢100倍以上还算合理,8266的速度比stm32慢比较正常,程序很多都在sp ...

函数方式快是micropython运行机制造成的,可以参考3楼的参考帖子。


回复

使用道具 举报

7429

TA的帖子

14

TA的资源

版主

Rank: 6Rank: 6

测评达人

发表于 2019-1-7 21:17:27 | 显示全部楼层
wangshujun72 发表于 2019-1-7 16:11
新测试
关闭掉wifi模块时间缩短到255ms
循环变量修改成以下模式缩短到111ms
似乎stm32的改成函数写法主 ...

优化的机制也是与micropython的设计有关,上面的优化是原作者给出的,应该是目前最有效的方式。将循环体改成变量,就不用每次循环后判断一次范围,减少了判断次数,所以可以提高速度。stm32是目前主要的硬件环境,也是优化最多的,最终支持汇编、机器码等优化,此外将程序变为python字节码也可以提供一点运行速度


回复

使用道具 举报

26

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

 楼主| 发表于 2019-1-9 10:47:23 | 显示全部楼层
替换成esp32的240兆环境用时从111减少到33毫秒,看来两者的速度差异还是可观的,后续考虑所有测试用esp32吧

点评

esp32分两种版本硬件和固件,带psRAM的版本速度要慢一些  详情 回复 发表于 2019-1-9 10:57


回复

使用道具 举报

7429

TA的帖子

14

TA的资源

版主

Rank: 6Rank: 6

测评达人

发表于 2019-1-9 10:57:55 | 显示全部楼层
wangshujun72 发表于 2019-1-9 10:47
替换成esp32的240兆环境用时从111减少到33毫秒,看来两者的速度差异还是可观的,后续考虑所有测试用esp32吧

esp32分两种版本硬件和固件,带psRAM的版本速度要慢一些


回复

使用道具 举报

26

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

 楼主| 发表于 2019-1-9 13:01:00 | 显示全部楼层
用的是不带psram的,很便宜20块左右的板子,买了两个
测试了一下蓝牙用例子跑了一下,能显示蓝牙设备服务都打不开


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

  • 论坛活动 E手掌握

    扫码关注
    EEWORLD 官方微信

  • EE福利  唾手可得

    扫码关注
    EE福利 唾手可得

Archiver|手机版|小黑屋|电子工程世界 ( 京ICP证 060456 )

GMT+8, 2019-1-19 01:59 , Processed in 0.373610 second(s), 17 queries , Gzip On, MemCache On.

快速回复 返回顶部 返回列表