精华内容
下载资源
问答
  • 原文链接:http://www.hankcs.com/program/cpp/cin-tie-with-sync_with_stdio-acceleration-input-and-output.html我是怎么在不知道这一对函数的情况下活到今天的,以前碰到cin TLE的时候总是傻乎乎地改成scanf,...

    原文链接:http://www.hankcs.com/program/cpp/cin-tie-with-sync_with_stdio-acceleration-input-and-output.html

    我是怎么在不知道这一对函数的情况下活到今天的,以前碰到cin TLE的时候总是傻乎乎地改成scanf,甚至还相信过C++在IO方面效率低下的鬼话,殊不知这只是C++为了兼容C而采取的保守措施。

    tie

    tie是将两个stream绑定的函数,空参数的话返回当前的输出流指针。

    1. #include <iostream>
    2. #include <fstream>
    3.  
    4. ///SubMain//
    5. int main(int argc, char *argv[])
    6. {
    7. std::ostream *prevstr;
    8. std::ofstream ofs;
    9. ofs.open("test.txt");
    10.  
    11. std::cout << "tie example:\n"; // 直接输出到屏幕
    12.  
    13. *std::cin.tie() << "This is inserted into cout\n"; // 空参数调用返回默认的output stream,也就是cout
    14. prevstr = std::cin.tie(&ofs); // cin绑定ofs,返回原来的output stream
    15. *std::cin.tie() << "This is inserted into the file\n"; // ofs,输出到文件
    16. std::cin.tie(prevstr); // 恢复
    17.  
    18. ofs.close();
    19. system("pause");
    20. return 0;
    21. }
    22. ///End Sub//

    输出:

    1. tie example:
    2. This is inserted into cout
    3. 请按任意键继续. . .

    同时当前目录下的test.txt输出:

    1. This is inserted into the file

    sync_with_stdio

    这个函数是一个“是否兼容stdio”的开关,C++为了兼容C,保证程序在使用了std::printfstd::cout的时候不发生混乱,将输出流绑到了一起。

    应用

    在ACM里,经常出现数据集超大造成 cin TLE的情况。这时候大部分人(包括原来我也是)认为这是cin的效率不及scanf的错,甚至还上升到C语言和C++语言的执行效率层面的无聊争论。其实像上文所说,这只是C++为了兼容而采取的保守措施。我们可以在IO之前将stdio解除绑定,这样做了之后要注意不要同时混用cout和printf之类。

    在默认的情况下cin绑定的是cout,每次执行 << 操作符的时候都要调用flush,这样会增加IO负担。可以通过tie(0)(0表示NULL)来解除cin与cout的绑定,进一步加快执行效率。

    如下所示:

    1. #include <iostream>
    2. int main() 
    3. {
    4.     std::ios::sync_with_stdio(false);
    5.     std::cin.tie(0);
    6.     // IO
    7. }

    原文地址:https://blog.csdn.net/yujuan_mao/article/details/8119529

    在竞赛中,遇到大数据时,往往读文件成了程序运行速度的瓶颈,需要更快的读取方式。相信几乎所有的C++学习者都在cin机器缓慢的速度上栽过跟头,于是从此以后发誓不用cin读数据。还有人说Pascal的read语句的速度是C/C++中scanf比不上的,C++选手只能干着急。难道C++真的低Pascal一等吗?答案是不言而喻的。一个进阶的方法是把数据一下子读进来,然后再转化字符串,这种方法传说中很不错,但具体如何从没试过,因此今天就索性把能想到的所有的读数据的方式都测试了一边,结果是惊人的。

    竞赛中读数据的情况最多的莫过于读一大堆整数了,于是我写了一个程序,生成一千万个随机数到data.txt中,一共55MB。然后我写了个程序主干计算运行时间,代码如下:

    最简单的方法就算写一个循环scanf了,代码如下:

    1. #include <ctime>  
    2. int main()  
    3. {  
    4.     int start = clock();  
    5.     //DO SOMETHING  
    6.     printf("%.3lf\n",double(clock()-start)/CLOCKS_PER_SEC);  
    7. }  
    #include <ctime>
    int main()
    {
    	int start = clock();
    	//DO SOMETHING
    	printf("%.3lf\n",double(clock()-start)/CLOCKS_PER_SEC);
    }

    最简单的方法就算写一个循环scanf了,代码如下:

    1. const int MAXN = 10000000;  
    2.    
    3. int numbers[MAXN];  
    4.    
    5. void scanf_read()  
    6. {  
    7.     freopen("data.txt","r",stdin);  
    8.     for (int i=0;i<MAXN;i++)  
    9.         scanf("%d",&numbers[i]);  
    10. }  
    const int MAXN = 10000000;
     
    int numbers[MAXN];
     
    void scanf_read()
    {
    	freopen("data.txt","r",stdin);
    	for (int i=0;i<MAXN;i++)
    		scanf("%d",&numbers[i]);
    }



     

    ?可是效率如何呢?在我的电脑Linux平台上测试结果为2.01秒。接下来是cin,代码如下
    1. const int MAXN = 10000000;  
    2.    
    3. int numbers[MAXN];  
    4.    
    5. void cin_read()  
    6. {  
    7.     freopen("data.txt","r",stdin);  
    8.     for (int i=0;i<MAXN;i++)  
    9.         std::cin >> numbers[i];  
    10. }  
    const int MAXN = 10000000;
     
    int numbers[MAXN];
     
    void cin_read()
    {
    	freopen("data.txt","r",stdin);
    	for (int i=0;i<MAXN;i++)
    		std::cin >> numbers[i];
    }

    ?[出乎我的意料,cin仅仅用了6.38秒,比我想象的要快。cin慢是有原因的,其实默认的时候,cin与stdin总是保持同步的,也就是说这两种方法可以混用,而不必担心文件指针混乱,同时cout和stdout也一样,两者混用不会输出顺序错乱。正因为这个兼容性的特性,导致cin有许多额外的开销,如何禁用这个特性呢?只需一个语句std::ios::sync_with_stdio(false);,这样就可以取消cin于stdin的同步了。程序如下:
    1. const int MAXN = 10000000;  
    2.    
    3. int numbers[MAXN];  
    4.    
    5. void cin_read_nosync()  
    6. {  
    7.     freopen("data.txt","r",stdin);  
    8.     std::ios::sync_with_stdio(false);  
    9.     for (int i=0;i<MAXN;i++)  
    10.         std::cin >> numbers[i];  
    11. }  
    const int MAXN = 10000000;
     
    int numbers[MAXN];
     
    void cin_read_nosync()
    {
    	freopen("data.txt","r",stdin);
    	std::ios::sync_with_stdio(false);
    	for (int i=0;i<MAXN;i++)
    		std::cin >> numbers[i];
    }

    取消同步后效率究竟如何?经测试运行时间锐减到了2.05秒,与scanf效率相差无几了!有了这个以后可以放心使用cin和cout了。

    接下来让我们测试一下读入整个文件再处理的方法,首先要写一个字符串转化为数组的函数,代码如下

    1. const int MAXS = 60*1024*1024;  
    2. char buf[MAXS];  
    3.    
    4. void analyse(char *buf,int len = MAXS)  
    5. {  
    6.     int i;  
    7.     numbers[i=0]=0;  
    8.     for (char *p=buf;*p && p-buf<len;p++)  
    9.         if (*p == ' ')  
    10.             numbers[++i]=0;  
    11.         else  
    12.             numbers[i] = numbers[i] * 10 + *p - '0';  
    13. }  
    const int MAXS = 60*1024*1024;
    char buf[MAXS];
     
    void analyse(char *buf,int len = MAXS)
    {
    	int i;
    	numbers[i=0]=0;
    	for (char *p=buf;*p && p-buf<len;p++)
    		if (*p == ' ')
    			numbers[++i]=0;
    		else
    			numbers[i] = numbers[i] * 10 + *p - '0';
    }


     

    把整个文件读入一个字符串最常用的方法是用fread,代码如下:

    1. const int MAXN = 10000000;  
    2. const int MAXS = 60*1024*1024;  
    3.    
    4. int numbers[MAXN];  
    5. char buf[MAXS];  
    6.    
    7. void fread_analyse()  
    8. {  
    9.     freopen("data.txt","rb",stdin);  
    10.     int len = fread(buf,1,MAXS,stdin);  
    11.     buf[len] = '\0';  
    12.     analyse(buf,len);  
    13. }  
    const int MAXN = 10000000;
    const int MAXS = 60*1024*1024;
     
    int numbers[MAXN];
    char buf[MAXS];
     
    void fread_analyse()
    {
    	freopen("data.txt","rb",stdin);
    	int len = fread(buf,1,MAXS,stdin);
    	buf[len] = '\0';
    	analyse(buf,len);
    }


     

    上述代码有着惊人的效率,经测试读取这10000000个数只用了0.29秒,效率提高了几乎10倍!掌握着种方法简直无敌了,不过,我记得fread是封装过的read,如果直接使用read,是不是更快呢?代码如下:

    1. const int MAXN = 10000000;  
    2. const int MAXS = 60*1024*1024;  
    3.    
    4. int numbers[MAXN];  
    5. char buf[MAXS];  
    6.    
    7. void read_analyse()  
    8. {  
    9.     int fd = open("data.txt",O_RDONLY);  
    10.     int len = read(fd,buf,MAXS);  
    11.     buf[len] = '\0';  
    12.     analyse(buf,len);  
    13. }  
    const int MAXN = 10000000;
    const int MAXS = 60*1024*1024;
     
    int numbers[MAXN];
    char buf[MAXS];
     
    void read_analyse()
    {
    	int fd = open("data.txt",O_RDONLY);
    	int len = read(fd,buf,MAXS);
    	buf[len] = '\0';
    	analyse(buf,len);
    }


     


    展开全文
  • <code class="language-bash">./lite/tools/build.sh -DLITE_WITH_CUDA=ON -DLITE_WITH_CV=ON -DLITE_BUILD_EXTRA=ON + readonly 'CMAKE_COMMON_OPTIONS=-DWITH_GPU=OFF -DWITH_MKL=...
  • 我是怎么在不知道这一对函数的情况下活到今天的,以前碰到cin TLE的时候总是傻乎乎地改成scanf,甚至还相信过C++在IO方面效率低下的鬼话,殊不知这只是C++为了兼容C而采取的保守措施。 tie tie是将两个stream绑定...

    我是怎么在不知道这一对函数的情况下活到今天的,以前碰到cin TLE的时候总是傻乎乎地改成scanf,甚至还相信过C++在IO方面效率低下的鬼话,殊不知这只是C++为了兼容C而采取的保守措施。

    tie

    tie是将两个stream绑定的函数,空参数的话返回当前的输出流指针。

    #include <iostream>
    #include <fstream>
     
    ///SubMain//
    int main(int argc, char *argv[])
    {
    	std::ostream *prevstr;
    	std::ofstream ofs;
    	ofs.open("test.txt");
     
    	std::cout << "tie example:\n";	// 直接输出到屏幕
     
    	*std::cin.tie() << "This is inserted into cout\n";	// 空参数调用返回默认的output stream,也就是cout
    	prevstr = std::cin.tie(&ofs);						// cin绑定ofs,返回原来的output stream
    	*std::cin.tie() << "This is inserted into the file\n";	// ofs,输出到文件
    	std::cin.tie(prevstr);									// 恢复
     
    	ofs.close();
    	system("pause");
    	return 0;
    }
    ///End Sub//


    输出:

    tie example:
    This is inserted into cout
    请按任意键继续. . .


    同时当前目录下的test.txt输出:

    This is inserted into the file
    


    sync_with_stdio

    这个函数是一个“是否兼容stdio”的开关,C++为了兼容C,保证程序在使用了std::printfstd::cout的时候不发生混乱,将输出流绑到了一起。

    应用

    在ACM里,经常出现数据集超大造成 cin TLE的情况。这时候大部分人(包括原来我也是)认为这是cin的效率不及scanf的错,甚至还上升到C语言和C++语言的执行效率层面的无聊争论。其实像上文所说,这只是C++为了兼容而采取的保守措施。我们可以在IO之前将stdio解除绑定,这样做了之后要注意不要同时混用cout和printf之类。

    在默认的情况下cin绑定的是cout,每次执行 << 操作符的时候都要调用flush,这样会增加IO负担。可以通过tie(0)(0表示NULL)来解除cin与cout的绑定,进一步加快执行效率。

    如下所示:

    #include <iostream>
    int main() 
    {
        std::ios::sync_with_stdio(false);
        std::cin.tie(0);
        // IO
    }


    reference:

    http://meme.biology.tohoku.ac.jp/students/iwasaki/cxx/speed.html


    展开全文
  • 1. 用GPU加速训练,论文提到是用GPU做2D卷积,而实际的网络都是3D的卷积计算,这个怎么对应?怎样计算3D卷积? 2. 论文中的深度CNNs使用激活函数f(x) = max(0, x), 称为ReLU Nonlinearity。这比sigmoid、双曲正切...

    看了这篇论文和网上的阅读笔记,还没看代码。有一些问题列在这里,看看自己以后能不能回答。


    1. 用GPU加速训练,论文提到是用GPU做2D卷积,而实际的网络都是3D的卷积计算,这个怎么对应?怎样计算3D卷积?


    2. 论文中的深度CNNs使用激活函数f(x) = max(0, x), 称为ReLU Nonlinearity。这比sigmoid、双曲正切作为激活函数在训练速度上要快好几倍。那么ReLU在哪些模型上比较适用?是否能说在深度CNNs的训练上都可以用ReLU代替sigmoid? 毕竟在训练速度上有很大的优势。


    3. CNN结构图如下

    第4、5个卷积层和第3个卷积层的特征图大小相同(13X13),论文说它们之间没有正则化和池化运算,这么说只做了卷积运算?卷积运算不改变特征图大小?如果是这样那么第一层的大小55X55怎么算的,怎么不是56X56(224/4=56)?


    4. 在防止过拟合所采用的方法中,altering the intensities of the RGB channels这一步没看明白,这里对哪个对象做PCA?是每个像素、每张图还是整个训练集?

    展开全文
  • If you have any problems with the programme, please check first if there are answers below (English translation is at bottom). Thank you. 问题1:XP系统上运行软件时出现0xc0000135的错误,怎么回事? ...
  • If you have any problems with the programme, please check first if there are answers below (English translation is at bottom). Thank you. 问题1:XP系统上运行软件时出现0xc0000135的错误,怎么回事? ...
  • Squid中文权威指南

    2012-12-24 17:04:44
    15.2.7 httpd_accel_with_proxy 15.3 令人疑惑之处 15.3.1 一个主机,一个主机名 15.3.2 一个主机,多个主机名 15.3.3 多个主机,一个主机名 15.3.4 多个主机,多个主机名 15.4 访问控制 15.5 内容协商 15.6 补充 ...
  • Variational quantum Gibbs state preparation with a truncated Taylor series. arXiv:2005.08797 (2020). [pdf] [2] Wang, X., Song, Z. & Wang, Y. Variational Quantum Singular Value Decomposition. ...
  • 将训练好的模型文件.h5拷贝到树莓派,然后通过树莓派调用载入模型,即可处理实时的图像,并且根据图像预测出是0,1,2,3,4等数字,也就表示了树莓派该怎么移动,通过树莓派控制电机即可。 正在进行一些改进: 1....
  • 别问我怎么知道的...) 我们先手动在代码编辑器里对数据进行规范化,很玄学地用了一些正则表达式,一步一步进行规范化。 最后总结了一下,明确要构建的字典大概是什么样的,然后写了脚本来处理。 然后是通过公式...
  • 13. 无人车与交通的交互(AutonomousVehicles: Interaction with Traffic): 主要研究无人车如何与现有的交通生态共存,特别是传统车与无人车的共存。 比较有趣的一些研究包括 V2X 虚拟交通标志,通过视觉去评估...
  • 有没有一种数据结构可以加速访问呢,树就是其中一种,树可以将大部分的操作都优化到 O(logn) 的时间复杂度,可以大大提升效率;此外,我们在日常生活中无时无刻不在使用树,...
  • CUDA:Nvidia 提供的针对 GPU 加速的开发环境 Anaconda:创建独立的 Python 环境 FFmpeg:多媒体音视频处理开源库 6 应用前景 faceswap到底有哪些真正的社会价值呢? 我们可以用任何人来拍摄一个电影,然后变成我们...
  • 因为还不怎么用,所以以后再说吧。。。 Scipy Doc 杂文汇集 Python读取文件以及读取大文件 gensim之Word2vec使用 心得:多动手,别只看 机器学习及深度学习篇 机器学习网站及教程 机器学习入门教程与...
  • 也不需要关心它如何做负载均衡、如何实现网络加速,所以 CDN 对前端来说是 Serverless。再比如对象存储,和 CDN 一样,我们只需要将文件上传到对象存储,就可以直接使用了,不需要...
  • 新版Android开发教程.rar

    千次下载 热门讨论 2010-12-14 15:49:11
    ----------------------------...• 优化的图形库 包括定制的 2D 图形库, 3D 图形库基于 OpenGL ES 1.0 (硬件加速可选) • SQLite SQLite SQLite SQLite 用作结构化的数据存储 • 多媒体支持 包括常见的音频、视频和...
  • c语言编写单片机技巧

    2009-04-19 12:15:17
    with LCD型单片机等等。这些单片机的中文资料我们都公开在HOLTEK-p.htm" target="_blank" title="HOLTEK货源和PDF资料">HOLTEK网站www.holtek.com.cn 。 HOLTEK-p.htm" target="_blank" title="HOLTEK货源和PDF...
  • ExtAspNet_v2.3.2_dll

    2010-09-29 14:37:08
    ExtAspNet - ExtJS based ASP.NET Controls with Full AJAX Support ExtAspNet是一组专业的Asp.net控件库,拥有原生的AJAX支持和丰富的UI效果, 目标是创建没有ViewState,没有JavaScript,没有CSS,没有...

空空如也

空空如也

1 2
收藏数 29
精华内容 11
关键字:

with怎么加速