msvc 编译器下 , if语句里不会执行的语句耗时巨大,如何提升代码运行时间 ? 5C

小弟在写一个项目的时候遇到了这个问题,代码速度始终慢很多。windows下,QT5.7.1,用的是msvc编译器,这面这个函数执行1000次,耗时大约500ms,

int test(int a)
{
std::vector ll(100);
int b = 5;
for(int i=0;i {
for(int j=1;j if( j>65)
{
b++;
std::vector s(1);
}
}

}
return b;
}
,而当把代码改为

int test(int a)
{
std::vector ll(100);
int b = 5;
for(int i=0;i {
for(int j=1;j if( j>65)
{
b++;
//std::vector s(1);
}
}

}
return b;
}
耗时变成了0ms。

在mingw编译器下,则无这个问题,全都是0ms。我怀疑msvc下,是分支预测失败了很多次。那位大手子给分析一下,这个时间差距是什么导致的。if语句那里,改为

if(j<65)
{

}
else
{
b++;
std::vector s(1);
}
这样也没有作用,求大佬解答一下在msvc下,如何提升运行速度,非常感谢!(windows,msvc下 ,#define likely(x) __builtin_expect(!!(x),1) 宏用不了)

2个回答

需要用ida pro反编译以后分析下,看下代码分支偏移是不是过大,导致缓存命中失效。另外是不是用了debug版本,它会将所有代码都编译,方便下断点。

最大的可能是被编译器编译给优化了,你可以断点,看看反编译汇编代码,或者关掉编译优化试试

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
MSVC编译器
不用装Visual Studio也能用的VS C++编译器。 原文链接https://blog.csdn.net/m0_37809890/article/details/85103109
rust编译器(msvc版)
rust-1.17.0-x86_64-pc-windows-msvc.tar.gz rust SDK 离线安装包
MSVC编译器Warnings手册
Warning Number Description C6001 warning C6001: using uninitialized memory C6011 warning C6011: dereferencing NULL pointer C6029 warning C6029: possibl
线程里执行输出耗时
经过测试,线程里执行了调试输出,由于输出数据有几Kbyte,最后发现非常耗时。 发现花了几秒。。。 long beforeSystemOutTime = System.currentTimeMillis(); System.out.print("read:\n"); for (int j=0;j<buffs.length;j++) {  System.out.print(buffs[
if语句中如何跳出该语句,执行下一个if语句
谢谢大家!
执行不到if语句,但执行到else语句?
rn因为daynum = Abs(Now - CDate(Adodc1.Recordset.Fields("借书日期"))) 能执行,减出来的daynum也正确,rn所以Adodc1.Recordset.Fields("续借日期")应该也连接没问题,但问题如下:rn无论Adodc1.Recordset.Fields("续借日期")的内容是否空值,都执行不到if语句,而直接执行else语句???rnBorrowLimit '借书时限,如30天rnContinueLimit ’续借时限,如30天rnPrivate Sub ShowData()rn If Adodc1.Recordset.RecordCount <> 0 Thenrn Dim daynum As Integer ’ 借书日数rn Dim limitnum As Integer ’借书期限rn daynum = Abs(Now - CDate(Adodc1.Recordset.Fields("借书日期"))) rn rn If Adodc1.Recordset.Fields("续借日期") = "" Then ‘这里无法执行rn limitnum = BorrowLimitrnrn Elsern limitnum = BorrowLimit + ContinueLimit ’每次都执行这里rnrn End Ifrn End IfrnEnd Subrn真的不知有什么问题,高手们指点下,谢谢了!
SQL if语句执行两个执行语句体
if @iSide = 1rn (set @InQty = @v1_qty*@v1_qtyoprn set @OUInQty = @v1_ouqty*@v1_qtyop)rn elsern (set @OutQty = @v1_qty*@v1_qtyop*-1rn set @ouOutQty = @v1_ouqty*@v1_qtyop*-1)
if语句的使用(效率提升)
问题描述:   根据用户给定的月份,实现对该月份所在季节的判断?      3月,4月,5月       --&amp;gt; 春季               6月,7月,8月       --&amp;gt;夏季               9月,10月,11月   --&amp;gt; 秋季               12月,1月,2月     --&amp;gt;冬季                    ...
Qt中文路径乱码问题(MSVC编译器)
        一、由于使用GDAL必须在MSVC版本下的Qt中,因此下载了一个MSVC版本的Qt,但是在显示中文、利用GDALOpen函数读取图像、选择文件夹、写入图像时都不能有中文字符,如果有则显示为乱码。比如我想利用打开文件对话框传递fileName给GDAL打开函数,直接传递是不行的,因为GDALOpen第一个参数必须是const char*,而fileName必须是QString类型,因...
Qt Creator配置msvc的编译器
安装完VS2010旗舰版,还需要点击VS10sp1-KB983509继续安装升级文件。这样在Qt Creator就可以手动设置编译器了。点击打开链接
编译器执行代码
如何让编辑器运行你的代码 Unity3D可以通过事件触发来执行你的编辑器代码,但是我们需要一些编译器参数来告知编译器何时需要触发该段代码。
如何获取代码运行时间
如何获取代码运行时间 rn 在调试中,经常需要计算某一段代码的执行时间,下面给出两种常用的方式:rnrn第一种:使用GetTickCount函数rnrn[color=#FF0000]#includern#includernrnint main()rnrn DWORD start_time=GetTickCount();rn rn //此处为被测试代码rn rn DWORD end_time=GetTickCount();rn cout<<"The run time is:"<<(end_time-start_time)<<"ms!"<rn#includernrnint main()rnrn clock_t start_time=clock();rnrn rn //被测试代码rn rnrn clock_t end_time=clock();rn cout<< "Running time is: "<(end_time-start_time)/CLOCKS_PER_SEC*1000<<"ms"< rn#include rnusing namespace std; rnint main() rn rntime_t begin,end; rnbegin=clock(); rn//这里加上你的代码 rnend=clock(); rncout<<"runtime: "<rn1.timegm函数只是将struct tm结构转成time_t结构,不使用时区信息;rntime_t timegm(struct tm *tm); rn2.mktime使用时区信息rntime_t mktime(struct tm *tm);rntimelocal 函数是GNU扩展的与posix函数mktime相当rntime_t timelocal (struct tm *tm);rn3.gmtime函数只是将time_t结构转成struct tm结构,不使用时区信息;rnstruct tm * gmtime(const time_t *clock);rn4.localtime使用时区信息rnstruct tm * localtime(const time_t *clock);rn1.time获取时间,stime设置时间rntime_t t;rnt = time(&t);rn2.stime其参数应该是GMT时间,根据本地时区设置为本地时间;rnint stime(time_t *tp)rn3.UTC=true 表示采用夏时制;rn4.文件的修改时间等信息全部采用GMT时间存放,不同的系统在得到修改时间后通过localtime转换成本地时间;rn5.设置时区推荐使用setup来设置;rn6.设置时区也可以先更变/etc/sysconfig/clock中的设置 再将ln -fs /usr/share/zoneinfo/xxxx/xxx /etc/localtime 才能重效rntime_t只能表示68年的范围,即mktime只能返回1970-2038这一段范围的time_trn看看你的系统是否有time_t64,它能表示更大的时间范围rnrnWindow里面的一些不一样的rnCTime MFC类,好像就是把time.h封了个类,没扩展rnCTime t = GetCurrentTime();rnSYSTEMTIME 结构包含毫秒信息rntypedef struct _SYSTEMTIME rnWORD wYear; rnWORD wMonth; rnWORD wDayOfWeek; rnWORD wDay; rnWORD wHour; rnWORD wMinute; rnWORD wSecond; rnWORD wMilliseconds;rn SYSTEMTIME, *PSYSTEMTIME;rnSYSTEMTIME t1;rnGetSystemTime(&t1) rnCTime curTime(t1); rnWORD ms = t1.wMilliseconds;rnSYSTEMTIME sysTm;rn::GetLocalTime(&sysTm);rnrn在time.h中的_strtime() //只能在windows中用rnchar t[11];rn_strtime(t);rnputs(t);rn------------------------------------------------------------------------------rn_timeb定义在SYS\TIMEB.H,有四个fieldsrndstflagrnmillitmrntimerntimezonernvoid _ftime( struct _timeb *timeptr );rnstruct _timeb timebuffer;rn _ftime( &timebuffer );rn取当前时间:文档讲可以到ms,有人测试,好象只能到16ms!rnrn-------------------------------------------------------------------------rn如何设定当前系统时间---windowsrnSYSTEMTIME m_myLocalTime,*lpSystemTime;rn m_myLocalTime.wYear=2003;rn m_myLocalTime.wMonth=1;rn m_myLocalTime.wDay=1;rn m_myLocalTime.wHour=0;rn m_myLocalTime.wMinute=0;rn m_myLocalTime.wSecond=0;rn m_myLocalTime.wMilliseconds=0;rn lpSystemTime=&m_myLocalTime;rn if( SetLocalTime(lpSystemTime) ) //此处换成 SetSystemTime( )也不行rn MessageBox("OK !"); rn elsern MessageBox("Error !"); rnrnSYSTEMTIME m_myLocalTime,*lpSystemTime;rnm_myLocalTime.wYear=2003;rnm_myLocalTime.wMonth=1;rnm_myLocalTime.wDay=1;rnlpSystemTime=&m_myLocalTime;rnif( SetDate(lpSystemTime) ) //此处换成 SetSystemTime( )也不行rn MessageBox("OK !"); rnelsern MessageBox("Error !"); rnrn-----------------------------------------------------------------------------rn用clock()函数,得到系统启动以后的毫秒级时间,然后除以CLOCKS_PER_SEC,就可以换成“秒”,标准c函数。rnclock_t clock ( void );rn#include rnclock_t t = clock();rnlong sec = t / CLOCKS_PER_SEC;rn他是记录时钟周期的,实现看来不会很精确,需要试验验证;rn---------------------------------------------------------------------------rn据说tc2.0的time结构含有毫秒信息rn#include rn#include rnint main(void) rn rn struct time t;rn gettime(&t); rn printf("The current time is: %2d:%02d:%02d.%02d\n", rn t.ti_hour, t.ti_min, t.ti_sec, t.ti_hund); rn return 0; rn rntime 是一个结构体,, 其中成员函数 ti_hund 是豪秒。。。上程序可以在tc2.0运行rn--------------------------------------------------------------------------------rn这个是windows里面常用来计算程序运行时间的函数;rnDWORD dwStart = GetTickCount();rn//这里运行你的程序代码rnDWORD dwEnd = GetTickCount();rn则(dwEnd-dwStart)就是你的程序运行时间, 以毫秒为单位rn这个函数只精确到55ms,1个tick就是55ms。rnrn--------------------------------------------------------------------------------rntimeGetTime()基本等于GetTickCount(),但是精度更高rnDWORD dwStart = timeGetTime();rn//这里运行你的程序代码rnDWORD dwEnd = timeGetTime();rn则(dwEnd-dwStart)就是你的程序运行时间, 以毫秒为单位 rn虽然返回的值单位应该是ms,但传说精度只有10ms。rn--------------------------------------------------------------------------------rnrnBorland C++ Builder VCL的时间函数rn  1. Datern  返回TDateTime对象,包含当前的年月日信息,函数原型如下:rn  System::TDateTime __fastcall Date(void);rn  2. Timern  返回TDateTime对象,包含当前的时间信息,函数原型如下:rn  System::TDateTime __fastcall Time(void);rn  3. Nowrn  返回TDateTime对象,获取当前的日期和时间信息,函数原型如下:rn  System::TDateTime __fastcall Now(void);rn  4. DatetimeToStringrn  将TDateTime对象转换为指定格式的字符串对象,函数原型如下:rn  void __fastcall DateTimeToString(AnsiString &;Result, const AnsiString Format,System::TDateTime DateTime);rn  5. DateToStrrn  将TDateTime对象(包含当前年月日信息)转换为字符串对象,函数原型如下:rn  AnsiString __fastcall DateToStr(System::TDateTime Date);rn  6. TimeToStrrn  将当前日期转换为字符串对象,函数原型如下:rn  AnsiString __fastcall TimeToStr(System::TDateTime Time);rn  7. DateTimetoStrrn  将TDateTime对象转换为字符串对象,函数原型如下:rn  AnsiString __fastcall DateTimeToStr(System::TDateTime DateTime);rn  8. StrToDatern  将字符串对象转换为年月日对象,函数原型如下:rn  System::TDateTime __fastcall StrToDate(const AnsiString S);rn  9. StrToTimern  将字符串对象转换时间对象,函数原型如下:rn  System::TDateTime __fastcall StrToTime(const AnsiString S);rn  10.StrToDateTimern  将字符串对象转换为年月日时间对象,函数原型如下:rn  System::TDateTime __fastcall StrToDateTime(const AnsiString S);rn  11.DateTimeToSystemTimern  将TDateTime对象转换为操作系统时间,函数原型如下:rn  void __fastcall DateTimeToSystemTime(System::TDateTime DateTime, _SYSTEMTIME &;SystemTime);rn  12.SystemTimeToDateTimern  将操作系统时间转换为TDateTime对象,函数原型如下:rn  System::TDateTime __fastcall SystemTimeToDateTime(const _SYSTEMTIME &;SystemTime);rnrnrn---------------------------------------------------------------------------------------rn下面是转的一个用汇编的精确计时方法rn---------------------------------------------------------------------------------------rn如何获得程序或者一段代码运行的时间?你可能说有专门的程序测试工具,确实,不过你也可以在程序中嵌入汇编代码来实现。rn在Pentium的指令系统中有一条指令可以获得CPU内部64位计数器的值,我们可以通过代码两次获取该计数器的值而获得程序或代码运行的时钟周期数,进而通过你的cpu的频率算出一个时钟周期的时间,从而算出程序运行的确切时间。rn我们通过指令TDSIC来获得cpu内部计数器的值,指令TDSIC返回值放在EDX:EAX中,其中EDX中存放64位寄存器中高32位的值,EAX存放第32位的值.rn下面看看实现的代码:rn//用汇编实现获取一段代码运行的时间 rn#includernusing namespace std;rnvoid GetClockNumber (long high, long low); rnvoid GetRunTime();rnint main() rn rnlong HighStart,LowStart,HighEnd,LowEnd; rnlong numhigh,numlow; rn//获取代码运行开始时cpu内部计数器的值 rn__asm rn rnRDTSC rnmov HighStart, edx rnmov LowStart, eax rn rnfor(int i= 0; i<100000; i++ ) rn rn for(int i= 0; i<100000; i++ ) rn rn rn rn rn//获取代码结束时cpu内部计数器的值,并减去初值 rn __asm rn rnRDTSC rnmov HighEnd, edx rnMov LowEnd, eax rn;获取两次计数器值得差 rnsub eax, LowStart rncmp eax, 0 ; 如果低32的差为负则求返,因为第二次取得永远比第一次的大 rnjg L1 rnneg eax rnjmp L2 rn L1: mov numlow, eax rn L2: sbb edx, HighStart rnmov numhigh, edx rnrn rn //把两个计数器值之差放在一个64位的整形变量中 rn //先把高32位左移32位放在64的整形变量中,然后再加上低32位 rn__int64 timer =(numhigh<<32) + numlow; rn //输出代码段运行的时钟周期数 rn //以频率1.1Gcpu为例,如果换计算机把其中的1.1改乘其它即可,因为相信大家的cpu都应该在1G以上 ^_^ rncout<< (double) (timer /1.1/1000000000) << endl; rnreturn 0; rnrnrn 这样通过一条简单的汇编指令就可以获得程序或一段代码的大概时间,不过并不能得到运行的确切时间,因为即使去掉中间的循环,程序也会有个运行时间,rn因为在第一次取得计数器的值后,有两条汇编指令mov HighStart, edx mov LowStart, eax这两条指令当然也有运行时间 ,当然你可以减去这两条指令的运行时间(在1.1G的机子上是3e-8s),这样会更精确一点。rn如果你要确切知道程序的运行时间,专业的测试软件肯定会更好一点,不过好像一般没有必要获取除非专门的要求的程序。rn不过能DIY一个也是不错的,不管有没有,最起码你可以学到在VC++中如何嵌入汇编代码以及如何使用32位的寄存器,其实和16位的寄存器一样使用,将来64的也应该一样,只不过位数不同罢了 rnrn
如何执行字符串里的语句?
例如,有一个CString 类型的串s,s的内容是"a=b"。rn怎样才能在程序中将a=b提取出来,并且执行它,从而将b的值赋给a?
sqlserver 循环更新总耗时差异巨大
第一次使用随机数对记录赋值:rn[code=java]rnpublic class Test rn public Test()rn MyJdbcTemplate myJdbcTemplate=(MyJdbcTemplate) Bean.getCtx().getBean("myJdbcTemplate");rn Random ran=new Random();rn long starttime=Calendar.getInstance().getTimeInMillis();rn for(int i=0;i<9999;i++) rn long starttime2=Calendar.getInstance().getTimeInMillis();rn int j=ran.nextInt(999);rn myJdbcTemplate.update("update player_bag set goodsnum="+j+" where playerid=922 and goodsid=59");rnrn long times=Calendar.getInstance().getTimeInMillis()-starttime2;rn if(times>1.5)rn System.out.println(i+","+times);rn rn long endtime=Calendar.getInstance().getTimeInMillis();rn System.out.println("总耗时:"+(endtime-starttime)+"毫秒...");rn rnrn[/code]rnrn截取最后部分输出内容:rn4990,2rn5092,2rn5952,2rn6036,2rn6768,2rn7961,2rn7963,3rn总耗时:3590毫秒...rnrn第二次把随机数换成i:rn[code=java]rnpublic class Test rn public Test()rn MyJdbcTemplate myJdbcTemplate=(MyJdbcTemplate) Bean.getCtx().getBean("myJdbcTemplate");rn Random ran=new Random();rn long starttime=Calendar.getInstance().getTimeInMillis();rn for(int i=0;i<9999;i++) rn long starttime2=Calendar.getInstance().getTimeInMillis();rn int j=i;rn myJdbcTemplate.update("update player_bag set goodsnum="+j+" where playerid=922 and goodsid=59");rnrn long times=Calendar.getInstance().getTimeInMillis()-starttime2;rn if(times>1.5)rn System.out.println(i+","+times);rn rn long endtime=Calendar.getInstance().getTimeInMillis();rn System.out.println("总耗时:"+(endtime-starttime)+"毫秒...");rn rnrn[/code]rnrn截取最后部分输出内容:rn9989,2rn9990,2rn9991,2rn9993,2rn9994,2rn9995,2rn9997,2rn9998,2rn总耗时:17483毫秒...rnrn测试了很多次都基本一样的结果。rn请问为什么会有如此大的差异?sqlserver 版本为2008 r2rn
执行一个语句耗时很长,为啥?
现在有一张tbl_fm_tmp_event_log表,包含32个字段,分别在i_serial_no,DT_GEN_TIME字段上建了索引,并且表中有十万多条记录,rn在sqlplus中,执行以下语句竟然要耗时几十秒钟rnDELETE FROM cgp_1.tbl_fm_tmp_event_log WHERE i_serial_no IN(SELECT i_serial_no FROM (SELECT i_serial_no FROM cgp_1.tbl_fm_tmp_event_log ORDER BY DT_GEN_TIME)rnWHERE ROWNUM <= 1);rn但是我单独执行SELECT i_serial_no FROM (SELECT i_serial_no FROM cgp_1.tbl_fm_tmp_event_log ORDER BY DT_GEN_TIME) WHERE ROWNUM <= 1 或DELETE FROM cgp_1.tbl_fm_tmp_event_log WHERE ROWNUM <= 1; 都很快。rn不知道为什么?rnrnrnrn
为什么execute语句不会执行
添加的语句不能执行,但换了删除的却可以不知道怎么回事rnif check="add" thenrn rn username=trim(request("username"))rn password=trim(request("password"))rn if username="" or password="" thenrn Response.Write (" ")rn response.endrn end ifrn conn.execute("insert into rsadmin(username,password)values('"&username&"','"&password&"')")rn conn.closern rn Response.Write (" ")rn response.endrn end ifrn删除语句:rnif check="delete" thenrn id=request("id")rn username=trim(request("username"))rn password=trim(request("password"))rn sql="delete from rsadmin where id="&idrn conn.Execute(sql)rn conn.closern response.Redirect "admin_user.asp"rn response.endrn end ifrn
执行累加语句会使得运行时间变长?
正在研究LZW压缩算法,用listid表示词典的当前下标。rn向词典内添加内容后,需要listid++来增加下标的值(40行),但是只要有listid进行累加的语句都会使得运行时间变长(近3000ms),将其注释掉之后程序就快很多了(<400ms),循环中同样有过count计数器用于计算循环次数却不会使程序变慢,求解原因。rn其中MAX_VAL = 4096,CHAR_COUNT = 256,测试时文件大小29.7M,循环31233732次。rn[code=c]void LZWCompress::Encode()rnrn int i;rn int prev; BYTE ch;rn int chid = 1;rn Entry list[MAX_VAL];rn int indexlist[MAX_VAL][CHAR_COUNT];rn int listid = TAG_BEGIN, codeid = 0;rn memset(list, -1, sizeof(Entry) * MAX_VAL);rn memset(indexlist, -1, sizeof(int) * MAX_VAL * CHAR_COUNT);rn code = (int*)malloc(sizeof(int) * size);rn DWORD t1 = GetTickCount();rn int count = 0;rn if (size < 3)rn for (i = 0; i < size; i++)rn code[codeid++] = (int)stream[i];rn elsern rn prev = (int)stream[0];rn while (true)rn rn count++;rn if (chid >= size)rn rn code[codeid++] = prev;rn code[codeid++] = TAG_END;rn break;rn rn if (listid >= MAX_VAL)rn rn code[codeid++] = TAG_NEW;rn memset(list, -1, sizeof(Entry) * MAX_VAL);rn memset(indexlist, -1, sizeof(int) * MAX_VAL * CHAR_COUNT);rn listid = TAG_BEGIN;rn rn ch = stream[chid];rn if (indexlist[prev][ch] == -1)rn rn list[listid].prev = prev; list[listid].ch = ch;rn indexlist[prev][ch] = listid++; // This process must be advanced.rn code[codeid++] = prev;rn prev = (int)stream[chid];rn rn elsern prev = indexlist[prev][ch];rn chid++;rn rn rn printf("%d\n", codeid);rn DWORD t2 = GetTickCount();rn printf("%d times.\n", count);rn printf("Encoding time: %d.\n", t2 - t1);rn[/code]
如何得到SQL语句的运行时间?
我在sybase数据库中运行一条SQL语句,我怎么知道运行该语句话了多长时间?rn是不是有变量纪录请指教?rn
if语句里面的不能执行,帮忙看看代码
protected void Button1_Click(object sender, EventArgs e)rn rn string conn = ConfigurationSettings.AppSettings["strconn"];rn SqlConnection st = new SqlConnection(conn); rn string strSelect;rn string strSelect2;rn string strSelect3;rn SqlCommand cmdSelect;rn SqlCommand cmdSelect2;rn SqlCommand cmdSelect3;rn strSelect = "select [customerno],[goodsno],[goodsnumber] from[stock] where (([customerno]="+customer.Text +") AND ( [goodsno]='"+product.Text+"'))";rn strSelect2="select [customerno],[goodsno],[goodsnumber] from[stock] where (([customerno]="+customer.Text +"))";rn strSelect3="select [customerno],[goodsno],[goodsnumber] from[stock] where (([goodsno]='"+product.Text+"'))";rn cmdSelect = new SqlCommand(strSelect ,st );rn cmdSelect2 = new SqlCommand(strSelect2,st);rn cmdSelect3 = new SqlCommand(strSelect3, st);rn st.Open();rn DataSet ds = new DataSet(); rn if (customer.Text == "")rn rn if (product.Text == "")rn rn Response.Write(" ");rnrn rn elsern rn cmdSelect3.ExecuteNonQuery();rn SqlDataAdapter da1 = new SqlDataAdapter(strSelect3, st);rn da1.Fill(ds);rn GridView1.DataSource = ds;rn GridView1.DataBind();rn rn rn rn elsern if (product.Text == "")rn rn cmdSelect2.ExecuteNonQuery();rn SqlDataAdapter da2 = new SqlDataAdapter(strSelect2, st);rn da2.Fill(ds);rn GridView1.DataSource = ds;rn GridView1.DataBind();rn rn elsern rn rn cmdSelect.ExecuteNonQuery();rn SqlDataAdapter da3 = new SqlDataAdapter(strSelect, st);rn da3.Fill(ds);rn GridView1.DataSource = ds;rn GridView1.DataBind();rn rn long TotolCount = 0;rn if (ds != null && ds.Tables[0].Rows.Count > 0)rn rn for (int i = 0; i < ds.Tables[0].Rows.Count; i++)rn rn long TempCount = 0;rn object a= ds.Tables[0].Rows[i]["goodsnumber"];rn if (a == null)rn rn TempCount = 0;rn rn TempCount = long.Parse(a.ToString () );rn TotolCount += TempCount;rn rn rn this.TextBox1.Text = TotolCount.ToString();rn st.Close();rnrnrn
执行delete语句怎么显示有两个耗时巨大的OrderBy计划?
环境:sql2000rn执行语句:delete from ps_ReadCard where RCDate<='2005.05.31' --影响 1,205,310 行(耗时 7分41秒)rnps_ReadCard表(打卡记录表) 主键(聚cu4索引):打卡日期, 打卡时间, 卡号rn另有个索引: 打卡日期, 卡号rnrn不知怎么发图片,查询分析器中,执行计划大概如下(从后往前写,"===="是显示的两行同步执行的):rn02% ps_ReadCard.PK_ps_ReadCard (SEEK: 打卡日期<'2005.05.31')rn00% Toprn00% Table Delete/Deletern05% Table Spool/Eager Spool ==== 08% Table Spool/Eager Spoolrn44% Sort(ORDER BY: 打卡日期, 打卡时间, 卡号) ==== 40% Sort (ORDER BY: 打卡日期,卡号, Bmk1000) --没Bmk1000这个字段,可能是sql执行过程中自动产生的rn00% Index Delete/Delete ==== 00% Index Delete/Deletern01% Sequence Costrn00% DELETErnrn发现执行计划中出现了两个Sort,且这两个Sort就占了 84%(44%+40%)。rnrn后面加了个索引仅包括打卡日期,执行计划最后面的改为了:rn01% ps_ReadCard.IX_ps_ReadCard_DateOnlyrn但中间仍然显示有 3个28%=84% 的Sort:rn28% Sort(ORDER BY: 打卡日期, 打卡时间, 卡号) ==== 28% Sort(ORDER BY: 打卡日期,卡号, Bmk1000) ==== 28% Sort (ORDER BY: 打卡日期, Bmk1000)rnrnrn看其执行过程好像是有几个索引就会产生几个大OrderBy操作,rn真正费时的不是在删表记录,而是删索引时产生的排序操作。rn如何使其不产生排序?rn
msvc:BAT脚本判断是否设置MSVC编译的环境变量(执行vcvarsall.bat)
关于设置MSVC环境变量的方式参见我之前写一篇博客:《msvc交叉编译:使用vcvarsall.bat设置命令行编译环境》。 如果你在CMD中反复执行vcvarsall.bat会导致环境变量存储空间溢出而出错。 所以写BAT脚本如果不判断是否设置了MSVC环境变量,而每次编译的时候都执行vcvarsall.bat,在同一个CMD下执行几次就会出错了,只能关闭当前的CMD,再重开一个。 这...
mybatis里面xml中SQL语句if语句里嵌套if语句
mybatis里面的if语句需要加上(但是有时不需要 但是(又是在if语句中的 案例一  不完善 &amp;lt;select id=&quot;selectRechargeInfoChainCount&quot; resultType=&quot;int&quot;&amp;gt;       select count(*) from t_group_card_recharge_info     &amp;lt;where&amp;gt;      &amp;lt;if...
请问如何知道执行一段语句耗时多少?
最好能精确到us级别!!ms级别也凑合!
Qt使用MSVC编译器输出中文乱码的问题
在Qt Creator中使用MSVC编译器编译时,程序中的中文字符很容易出现乱码的情况。特写此篇博客分析原因和解决方法。 本文示例采用Qt5.9.6版本和MSVC2015版本。 一  原因分析     Qt Creator保存的文件(如.cpp .h)默认保存为UTF-8编码(任何平台、任何语言都能使用的跨平台字符集),而MSVC编译器虽然可以正常编译带BOM的UTF-8编码的源文件,但是生...
MSVC在c++中是编译器常量吗?
#include rn#include rn#include rn#include "memory_functions.h"rn#include "compat.h"rnrn#ifdef MSVCrn#include rn#endifrnrnrnchar *strdup_hp(char *dest, char *src) rn unsigned int ls=0, md=0;rn rn if (!src) return 0;rn ls=strlen(src);rnrn if (!dest) rn rn dest=(char *)malloc((ls/STRING_BUFF_SIZE+1)*STRING_BUFF_SIZE+1);rn if (!ls && dest)rn rn dest[0]=0;rn return dest;rn rn rn elsern rn if (!ls)rn rn dest[0]=0;rn return dest;rn rn md=_msize(dest);rn if (md
PHP执行耗时优化
一、耗时纪录方式 (待补充) 二、耗时优化方法 1、合理使用 fastcgi_finish_request() 函数 根据 PHP 手册的说明:此函数冲刷(flush)所有响应的数据给客户端并结束请求。 这使得客户端结束连接后,需要大量时间运行的任务能够继续运行。 也就是说,执行该函数后,客户端就会收到本次请求的结果,但是服务端会继续执行本次请求剩余的逻辑。这时即使执行一些耗时操作,客户...
数据库统计执行耗时
前提:表字段包含:创建时间、最后修改时间。时间字段为timestamp类型。 要求:统计业务执行耗时,单位毫秒,分区间统计。 执行: select stat, count(*) from (select case when milli &amp;lt;= 10 then 'time&amp;lt;=10' ...
XP系统下,配置Qt Creator和msvc编译器
目的:Qt工程调用VC编译的库文件(.dll   .lib   .h) 然而之前安装配置的Qt Creator编译器是mingw,并不支持MSVC编译器编译的库文件; 针对这样的问题,想过两种解决方案: 1.安装VS2010,并配置VS2010+Qt4.8.4,Qt是VS2010的一个插件,编写程序在VS2010中进行; 2.安装VS2010,并配置Qt Creator4.8.4+MSVC
如何计算一段代码的运行时间
1.用指令周期,51系列单片机指令周期是晶振周期的12倍,比如12M晶振,指令周期是1us,每条指令的指令周期是不一样的。或者不嫌麻烦的话可以去数指令。注意:现在的很多MCU是多级流水线,其实这样计算是不太合适的。 2.用编程软件直接看,设置断点 然后调试 编译器可以看到用的时间是多少。注意:用软件仿真,软件的相关配置一定要正确。 3.用示波器,测试电平翻转速度。注意:IO口本身就有一个最大翻
如何测量一段代码的运行时间
如何[color=#FF0000]用vb测量[/color]这段代码的运行所需的时间?rnPrivate Declare Function GetTickCount Lib "kernel32" () As LongrnPrivate Sub Command1_Click()rna = GetTickCountrn Dim str As String, iBegin As Integer, iEnd As Integer, strTemp1 As String, strTemp2 As Stringrn str = "*88*1171>cre_46t*4444*h=468fskfjsdkfjsdkfjsdkf*ffff*fsdkfjsdkfjsdkfjsdkfj*33333333433*jjjjdddddq"rn rn Do While (True)rn iBegin = InStr(1, str, "*")rn If iBegin <= 0 Then Exit Dorn rn iEnd = InStr(iBegin + 1, str, "*")rn If iEnd <= 0 Then Exit Dorn rn strTemp1 = Mid(str, 1, iBegin - 1)rn strTemp2 = Mid(str, iEnd + 1, Len(str) - iEnd)rn str = strTemp1 & "AA" & strTemp2rn DoEventsrn Looprn rnrn rnEnd Subrn
C++如何计算代码运行时间
#include&amp;lt;iostream&amp;gt; #include&amp;lt;ctime&amp;gt; using namespace std; void main() { //统计运行时间精确到秒 time_t tstart, tend; long i=1000000000000; tstart=time(0); while(i--); tend=time(0); c...
在Visual C++ 2012(MSVC)编译SDCC编译器
当你想使用一个开源的工具来开发单片机51程序时,可以使用SDCC编译器,它不仅是免费的,还是开放源码的编译器;不仅让你可以开发51的程序,还可以深入了解编译原理的编译器。通过本文的指导,你可以实现自己编译一个51编译器出来,也可以继续深入地了解编译器的原理作为基础。 为了下载SDCC编译器的源码,你得先到官方网站下载相应的代码,下载代码有两种方式:方式一是通过SVN代码库来下载:svn://svn
MSVC 和 ARM编译器对注释的识别问题
#define FUNCTION_XYZ /**this function is aaa*/ 这句话在arnm编译器下面没有问题,但是放到MSVC编译器则会报错, 解决方法:把这句话写成#define FUNCTION_XYZ /**this function is aaa */,在注释的最后添加一个空格 ...
QT跨MinGW和MSVC两种编译器的解决办法
由于MinGW的编译速度较慢,所以项目采用QT Creator上开发,VS2015上进行编译。但是两边由于自带库和编译环境的差异,会报许多错误。 为了兼容两个平台,可以使用以下方式进行头文件导入、宏定义以及某些代码的定义等。 #ifdef _MSC_VER //此处为MSVC编译器环境下的代码 #elif __GNUC__ //此处为MinGW编译器环境下的代码 #endif 如果是针对不同
Opencv + Qt(VS编译器MSVC版本)的使用
这里使用的MSVC版本的QT,这个版本的好处是可以用vs编译器。 **步骤:** 1、opencv2.4.9 由于原来编译过VS用的源代码,现在直接把里面的bin、include、lib拿出来即可: 注意dll把debug和release版本的都拿出来2、在.pro文件中添加路径:INCLUDEPATH+=D:\opencv\QtOpencv\include\opencv\ D:\open
不同平台编译器MSVC,GCC,MingW,Cygwin
不想装VS,太大了,想直接用QtCreator,但是如果选的creator是vs版的话,还得安装vs,所以想找一下在windows下直接用的编译器和调试器,找到了下面的文章,学习。 https://www.cnblogs.com/findumars/p/6250998.html ...
[Visual Studio] MSVC编译器中文乱码解决办法
MSVC编译器中文乱码解决办法 源代码设置为UTF-8 BOM格式; 将余下代码复制到源代码中。 #if _MSC_VER &amp;amp;amp;amp;gt;= 1600 #pragma execution_character_set(“utf-8”) #endif
ODBC 执行一个耗时很长的语句 如何判断语句执行成功
想自己封装ODBC 但是遇到一个问题rn当用SQLExecDirect执行语句时,普通的语句都没问题,如果成功会返回 SQL_SUCCESS 或者 SQL_SUCCESS_WITH_INFO ,而且都得到了我需要的结果,可是当执行一个较长的语句时 也会返回 SQL_SUCCESS_WITH_INFO 事实却是这个语句没有执行成功,如果这个时候释放句柄就会发生未知错误。rn不如说执行语句 : RESTORE DATABASE [db_sm] FROM DISK = N'D:\201412031200.bak' WITH FILE = 1, MOVE N'eisdb_Data' TO N'D:\pdt3000\db\db_sm.mdf', MOVE N'eisdb_Log' TO N'D:\pdt3000\db\db_sm.ldfrnrn求教大神:odbc中 如何知道一个查询完全结束了。
MSVC里__forceinline的真正作用
 MSVC里__forceinline的真正作用:如果这个函数能在O2下是内联的,那么在O1优化下将原本调用方式的代码转换成内联的 debug下依然无效
如何使用MSVC编程问题
用VC++编程的时候 会遇到很多很多的API函数 我也很想用这些 但是实在太多 记不住 而且里头的参数特多 虽然说写好函数名后就会出现个参数 但是有时候输入错误他会他就会消失 怎么非常快捷地让他重新出现 还有他那些非常多的常量 怎么去记住 这个问题一直困扰着我 也影响我的实践 请问 该怎么办
相关热词 c++和c#哪个就业率高 c# 批量动态创建控件 c# 模块和程序集的区别 c# gmap 截图 c# 验证码图片生成类 c# 再次尝试 连接失败 c#开发编写规范 c# 压缩图片好麻烦 c#计算数组中的平均值 c#获取路由参数