| 赞 | 0 |
| VIP | 6 |
| 好人卡 | 8 |
| 积分 | 1 |
| 经验 | 47949 |
| 最后登录 | 2020-5-5 |
| 在线时间 | 705 小时 |
Lv1.梦旅人
- 梦石
- 0
- 星屑
- 60
- 在线时间
- 705 小时
- 注册时间
- 2007-12-23
- 帖子
- 874
|
语言的速度还是靠实现来决定的
LZ既然搞过OI,那我就介绍一道最近冬令营的一道题目(那个测试点我当时一分都没拿到)
题面的意思是给你一个C++程序和输入,但这个程序在比赛时间5小时以内跑不出解,必须借助人为的优化。要求给出输出。
最后一个任务是一个很长很长的C++程序,内容大概是这样的:- void A() {++ans;}
- void B() {A();A();A();A();A();A();A();A();A();}
- void C() {B();B();B();B();B();B();B();B();B();}
- ..........
- void AB() {A(); A(); B(); B();}
- void AC() {A(); A(); C(); C();}
- .........
复制代码 主程序里就是一堆函数调用,要求输出最后的ans
这样的程序按照正常的情况跑得出来才有鬼呢。但办法也是有的。有牛人编了个程序分析语义的;大多数人开了个map(或者是hash)记忆化;最强的是我的一个同学:他用clang开优化开关直接编译,结果把这个神奇的程序直接优化掉了,一秒出解!
所以即使是同一种语言,不同的实现对效率的影响也是很重要的。比如RGSS对安全性的要求很高、对效率要求不高,因此不仅效率低,还有调用栈的层数限制等等蛋疼的设定。
光看语言的话,理论上静态的的确会快,但是也不绝对。比如scanf和printf是运行时决定I/O的数据类型,而cin/cout是编译时就已经决定了数据类型,但前两者的运行速度却要快得多。因此主要还是具体实现的问题吧。 |
|