1
6
这并不是最优雅的代码,我可能有一些边缘案例,但这足以让您使用更快的方法。
这是密码。
|
2
12
速度不是由计算决定的,程序运行的大部分时间是由i/o消耗的。
setvbuf
在第一个之前打电话
--编辑-- 幻数 是新的缓冲区大小。默认情况下,文件使用512字节的缓冲区。增加这个大小会减少C++运行库向操作系统发出读写调用的次数,这是目前为止算法中最昂贵的操作。
如果没有任何已知的内存争用,请为缓冲区选择大约与关联文件大小相同的大小。也就是说,如果输入文件为250K,则将其用作缓冲区大小。随着缓冲区大小的增加,回报肯定会减少。对于250K示例,100K缓冲区需要三次读取,而默认512字节缓冲区需要500次读取。进一步增加缓冲区大小以便只需要一次读取不太可能比三次读取有显著的性能改进。 |
3
2
尝试将if语句替换为
但我认为您确实需要将输入缓冲到临时数组中。一次从输入中读取一个整数是昂贵的。若你们能将数据采集和数据处理分开,那个么编译器就能够为数学运算生成优化的代码。 |
4
2
虽然你的例子很简单,我几乎看不出你能消除什么——假设这是问题的一部分,那么接下来阅读stdin。 对代码的一些注释:您的示例没有使用任何流-不需要包括iostream头。您已经通过将STLIO.H替代C++版本的头CSDIO,将C库元素加载到全局命名空间,因此不需要使用名称空间STD。 |
5
2
您可以使用gets()读取每一行,自己在不使用scanf()的情况下解析字符串(通常我不建议使用gets(),但在本例中,输入是经过良好指定的。)
此程序比您在上面给出的解决方案(在我的机器上)快约2.6倍。 |
6
1
|
7
1
我认为代码很好。我用不到0.3秒的时间在我的电脑上运行了它 我甚至在不到一秒钟的时间里用更大的输入运行它。 你是怎么定时间的? 从total=n开始,然后在循环内: total-=int((输入%k)/k+1)//0如果可整除,1如果不可整除 |
8
1
这使用了我多年前编写的线程安全队列类:
你从中获得的确切数量取决于阅读所花费的时间与其他处理所花费的时间。在本例中,另一个处理非常简单,可能不会获得太多收益。如果在处理数据上花费更多的时间,多线程可能会获得更多。 |
9
1
2.5mb/秒是400ns/字节。 有两个大的每字节进程,文件输入和解析。
循环,首先是在前导空格上,然后是在数字上,应该尽可能快,当然要比400ns/字节小得多。 |
10
0
把两个大数字分开很难。也许一个改进是首先通过观察一些较小的素数来描述k。现在让我们说2、3和5。如果k可以被其中任何一个整除,那么inputnum也需要被整除,或者inputnum不能被k整除。当然还有更多的技巧(你可以使用bitwise and Of inputnum to 1来确定你是否可以被2整除),但我认为只要去掉低素数的可能性,速度就会得到合理的提高(无论如何值得一试)。 |
rookie · 检查函数模板的所有参数包参数是否属于int 1 年前 |
ivaigult · -W转换和隐式字符串到布尔类型转换 1 年前 |
rainer · 后台插入程序的初始化 1 年前 |
Community wiki · 以理智、安全和高效的方式复制文件 1 年前 |
Shefali Kanaujia · 对C中向量的向量进行排序++ 1 年前 |
Ma Joonyoung · 粗粒度和细粒度链表的时间比较 1 年前 |