计算程序运算时间问题

时间:2022-10-19 16:40:58
下面代码功能是两种实现0~n不重复随机数获得方法,后来想比较下哪个更快 结果死活出不来结果了,不知道为什么,请大家伙帮看看,谢谢!
#include "stdafx.h"
#include "stdlib.h"
#include "stdio.h"
#include "time.h"
#include "windows.h"
#define TIMES 100
void swap(int& a, int& b)
{
a = a + b;
b = a - b;
a = a - b;
}

int main(int argc, char* argv[])
{
printf("MAX_RAND=%u\n", RAND_MAX);
srand((unsigned int)time(NULL));
DWORD inter = GetTickCount();
int a[TIMES];
int i = 0;
for (; i < TIMES; ++i) 
{
a[i] = i;
}
for (i=TIMES; i > 0; --i) 
{
swap(a[i], a[rand()%TIMES]);
}
inter = GetTickCount() - inter;
printf("inter=%u\n================\n", inter);
DWORD inter2 = ::GetTickCount();
int b[TIMES] = {0};
int m;
for (i=0; i<TIMES; i++)
{
while(b[m=rand()%TIMES]);
b[m] = i;
}
inter2 = ::GetTickCount() - inter2;
printf("inter2=%u\n================\n", inter2);
return 0;
}

14 个解决方案

#1


#pragma once
#include <string>
#include <windows.h>

class CAutoTimer
{
public:
        CAutoTimer(const char* szName):m_strName(szName) 
        {
                if( !QueryPerformanceFrequency (&m_nFrequency) )
                {
                        m_nBegin.LowPart = GetTickCount();
                        m_bSupport = FALSE;
                }
                else
                {
                        QueryPerformanceCounter(&m_nBegin);
                        m_bSupport = TRUE;;
                }
        }

        ~CAutoTimer() 
        {
                if( !m_bSupport )
                {
                        DWORD dwDelta = GetTickCount() - m_nBegin.LowPart;
                        printf("%s: %u (ms)\n", m_strName.c_str(), dwDelta);
                }
                else
                {
                        LARGE_INTEGER end;
                        QueryPerformanceCounter(&end);
                        double fDelta = (double)(end.QuadPart - m_nBegin.QuadPart) * 1000 / m_nFrequency.QuadPart;
                        printf("%s: %f (ms)\n", m_strName.c_str(), fDelta);
                }
        }
private:
        std::string m_strName;
        LARGE_INTEGER m_nFrequency;
        LARGE_INTEGER m_nBegin;
        BOOL m_bSupport;
};

#define SET_AUTO_TIMER(name) CAutoTimer __CAutoTimer##name(#name)

#2


rand()
会根据前面的srand得到的种子按照一定规律得到数值,所以你的循环可能永远不能得到你要的;
你得每一次调用rand()之前,调用srand更新种子

#3


引用 2 楼 cxsjabcabc 的回复:
rand()
会根据前面的srand得到的种子按照一定规律得到数值,所以你的循环可能永远不能得到你要的;
你得每一次调用rand()之前,调用srand更新种子

现在问题是printf("inter=%u\n================\n", inter);输出不了想要的值,我用VC6.0编译的

#4


%u->%f 试试

#5


引用 4 楼 delphiwcdj 的回复:
%u->%f 试试

肯定不行啊

#6


看错了,中间添加个Sleep(1500);

#7


引用 6 楼 delphiwcdj 的回复:
看错了,中间添加个Sleep(1500);

计算程序运算时间问题

#8


引用 7 楼 j05070415 的回复:
引用 6 楼 delphiwcdj 的回复:
看错了,中间添加个Sleep(1500);


#include "stdafx.h"
#include "stdlib.h"
#include "stdio.h"
#include "time.h"
#include "windows.h"
#define TIMES 100
void swap(int& a, int& b)
{
a = a + b;
b = a - b;
a = a - b;
}

int main(int argc, char* argv[])
{
printf("MAX_RAND=%u\n", RAND_MAX);
srand((unsigned int)time(NULL));
DWORD inter = GetTickCount();
int a[TIMES];
int i = 0;
for (; i < TIMES; ++i) 
{
a[i] = i;
}
for (i=TIMES-1; i > 0; --i) // note
{
swap(a[i], a[rand()%TIMES]);
}
Sleep(1000);// note
inter = GetTickCount() - inter;
printf("inter=%u\n================\n", inter);
DWORD inter2 = ::GetTickCount();
int b[TIMES] = {0};
int m;
for (i=0; i<TIMES; i++)
{
while(b[m=rand()%TIMES]);
b[m] = i;
}
Sleep(1000);// note
inter2 = ::GetTickCount() - inter2;
printf("inter2=%u\n================\n", inter2);
return 0;
}

#9


引用 8 楼 delphiwcdj 的回复:
引用 7 楼 j05070415 的回复:

引用 6 楼 delphiwcdj 的回复:
看错了,中间添加个Sleep(1500);

C/C++ code

#include "stdafx.h"
#include "stdlib.h"
#include "stdio.h"
#include "time.h"
#include "windows.h"
#define TIMES ……

是解决了,但为什么呢

#10


引用 3 楼 j05070415 的回复:
引用 2 楼 cxsjabcabc 的回复:
rand()
会根据前面的srand得到的种子按照一定规律得到数值,所以你的循环可能永远不能得到你要的;
你得每一次调用rand()之前,调用srand更新种子

现在问题是printf("inter=%u\n================\n", inter);输出不了想要的值,我用VC6.0编译的


“printf("inter=%u\n================\n", inter);输出不了想要的值”
这句话什么意思?你要的是什么?Inter是tick流逝的个数。

#11


引用 9 楼 j05070415 的回复:
引用 8 楼 delphiwcdj 的回复:

引用 7 楼 j05070415 的回复:

引用 6 楼 delphiwcdj 的回复:
看错了,中间添加个Sleep(1500);

C/C++ code

#include "stdafx.h"
#include "stdlib.h"
#include "stdio.h"
#include "time.h"
#inc……


解决什么了?
延时会让打印出来的时间差大一点,这有什么改变么?

#12


引用 11 楼 cxsjabcabc 的回复:
引用 9 楼 j05070415 的回复:

引用 8 楼 delphiwcdj 的回复:

引用 7 楼 j05070415 的回复:

引用 6 楼 delphiwcdj 的回复:
看错了,中间添加个Sleep(1500);

C/C++ code

#include "stdafx.h"
#include "stdlib.h"
#include "stdio.h"……

你自己试试啊,最起码打印出来的值靠谱了,就是不明白为什么加Sleep()就能解决

#13


楼主概念不清啊!
随机必然有重复,所谓“不重复随机”不是随机,而是洗牌。
洗牌请参考下面:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int d[6];
int i,n,a,b,t;
int c,j;
void main() {
    srand(time(NULL));
    printf("shuffle 0..n-1 demo\n");
    for (n=1;n<=5;n++) {/* 测试1~5个元素 */
        printf("_____n=%d_____\n",n);
        j=1;
        for (c=1;c<=n;c++) j=j*c;/* j为n! */
        j*=n*2;
        for (c=1;c<=j;c++) {/* 测试n*2*n!次 */
            for (i=0;i<n;i++) d[i]=i;/* 填写0~n-1 */
            for (i=n;i>0;i--) {/* 打乱0~n-1 */
                a=i-1;b=rand()%i;
                if (a!=b) {t=d[a];d[a]=d[b];d[b]=t;}
            }
            printf("%04d:",c);
            for (i=0;i<n;i++) printf("%d",d[i]);
            printf("\n");
        }
    }
    printf("shuffle 1..n demo\n");
    for (n=1;n<=5;n++) {/* 测试1~5个元素 */
        printf("_____n=%d_____\n",n);
        j=1;
        for (c=1;c<=n;c++) j=j*c;/* j为n! */
        j*=n*2;
        for (c=1;c<=j;c++) {/* 测试n*2*n!次 */
            for (i=1;i<=n;i++) d[i]=i;/* 填写1~n */
            for (i=n;i>1;i--) {/* 打乱1~n */
                a=i;b=rand()%i+1;
                if (a!=b) {t=d[a];d[a]=d[b];d[b]=t;}
            }
            printf("%04d:",c);
            for (i=1;i<=n;i++) printf("%d",d[i]);
            printf("\n");
        }
    }
}

#14


引用 13 楼 zhao4zhong1 的回复:
楼主概念不清啊!
随机必然有重复,所谓“不重复随机”不是随机,而是洗牌。
洗牌请参考下面:
C/C++ code
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int d[6];
int i,n,a,b,t;
int c,j;
void main() {
    srand(time(NULL));
    printf……

不好意思,
首先,我的要求是取得随机数去掉其中重复数值,这与随机数有没有重复没关系吧,而且你说的也有问题,随机数也有可能没重复的。
其次,这段代码探讨的是思路与效率问题。
最后,我不知道你运行过这段代码没,得到这段代码想要的结果了?

#1


#pragma once
#include <string>
#include <windows.h>

class CAutoTimer
{
public:
        CAutoTimer(const char* szName):m_strName(szName) 
        {
                if( !QueryPerformanceFrequency (&m_nFrequency) )
                {
                        m_nBegin.LowPart = GetTickCount();
                        m_bSupport = FALSE;
                }
                else
                {
                        QueryPerformanceCounter(&m_nBegin);
                        m_bSupport = TRUE;;
                }
        }

        ~CAutoTimer() 
        {
                if( !m_bSupport )
                {
                        DWORD dwDelta = GetTickCount() - m_nBegin.LowPart;
                        printf("%s: %u (ms)\n", m_strName.c_str(), dwDelta);
                }
                else
                {
                        LARGE_INTEGER end;
                        QueryPerformanceCounter(&end);
                        double fDelta = (double)(end.QuadPart - m_nBegin.QuadPart) * 1000 / m_nFrequency.QuadPart;
                        printf("%s: %f (ms)\n", m_strName.c_str(), fDelta);
                }
        }
private:
        std::string m_strName;
        LARGE_INTEGER m_nFrequency;
        LARGE_INTEGER m_nBegin;
        BOOL m_bSupport;
};

#define SET_AUTO_TIMER(name) CAutoTimer __CAutoTimer##name(#name)

#2


rand()
会根据前面的srand得到的种子按照一定规律得到数值,所以你的循环可能永远不能得到你要的;
你得每一次调用rand()之前,调用srand更新种子

#3


引用 2 楼 cxsjabcabc 的回复:
rand()
会根据前面的srand得到的种子按照一定规律得到数值,所以你的循环可能永远不能得到你要的;
你得每一次调用rand()之前,调用srand更新种子

现在问题是printf("inter=%u\n================\n", inter);输出不了想要的值,我用VC6.0编译的

#4


%u->%f 试试

#5


引用 4 楼 delphiwcdj 的回复:
%u->%f 试试

肯定不行啊

#6


看错了,中间添加个Sleep(1500);

#7


引用 6 楼 delphiwcdj 的回复:
看错了,中间添加个Sleep(1500);

计算程序运算时间问题

#8


引用 7 楼 j05070415 的回复:
引用 6 楼 delphiwcdj 的回复:
看错了,中间添加个Sleep(1500);


#include "stdafx.h"
#include "stdlib.h"
#include "stdio.h"
#include "time.h"
#include "windows.h"
#define TIMES 100
void swap(int& a, int& b)
{
a = a + b;
b = a - b;
a = a - b;
}

int main(int argc, char* argv[])
{
printf("MAX_RAND=%u\n", RAND_MAX);
srand((unsigned int)time(NULL));
DWORD inter = GetTickCount();
int a[TIMES];
int i = 0;
for (; i < TIMES; ++i) 
{
a[i] = i;
}
for (i=TIMES-1; i > 0; --i) // note
{
swap(a[i], a[rand()%TIMES]);
}
Sleep(1000);// note
inter = GetTickCount() - inter;
printf("inter=%u\n================\n", inter);
DWORD inter2 = ::GetTickCount();
int b[TIMES] = {0};
int m;
for (i=0; i<TIMES; i++)
{
while(b[m=rand()%TIMES]);
b[m] = i;
}
Sleep(1000);// note
inter2 = ::GetTickCount() - inter2;
printf("inter2=%u\n================\n", inter2);
return 0;
}

#9


引用 8 楼 delphiwcdj 的回复:
引用 7 楼 j05070415 的回复:

引用 6 楼 delphiwcdj 的回复:
看错了,中间添加个Sleep(1500);

C/C++ code

#include "stdafx.h"
#include "stdlib.h"
#include "stdio.h"
#include "time.h"
#include "windows.h"
#define TIMES ……

是解决了,但为什么呢

#10


引用 3 楼 j05070415 的回复:
引用 2 楼 cxsjabcabc 的回复:
rand()
会根据前面的srand得到的种子按照一定规律得到数值,所以你的循环可能永远不能得到你要的;
你得每一次调用rand()之前,调用srand更新种子

现在问题是printf("inter=%u\n================\n", inter);输出不了想要的值,我用VC6.0编译的


“printf("inter=%u\n================\n", inter);输出不了想要的值”
这句话什么意思?你要的是什么?Inter是tick流逝的个数。

#11


引用 9 楼 j05070415 的回复:
引用 8 楼 delphiwcdj 的回复:

引用 7 楼 j05070415 的回复:

引用 6 楼 delphiwcdj 的回复:
看错了,中间添加个Sleep(1500);

C/C++ code

#include "stdafx.h"
#include "stdlib.h"
#include "stdio.h"
#include "time.h"
#inc……


解决什么了?
延时会让打印出来的时间差大一点,这有什么改变么?

#12


引用 11 楼 cxsjabcabc 的回复:
引用 9 楼 j05070415 的回复:

引用 8 楼 delphiwcdj 的回复:

引用 7 楼 j05070415 的回复:

引用 6 楼 delphiwcdj 的回复:
看错了,中间添加个Sleep(1500);

C/C++ code

#include "stdafx.h"
#include "stdlib.h"
#include "stdio.h"……

你自己试试啊,最起码打印出来的值靠谱了,就是不明白为什么加Sleep()就能解决

#13


楼主概念不清啊!
随机必然有重复,所谓“不重复随机”不是随机,而是洗牌。
洗牌请参考下面:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int d[6];
int i,n,a,b,t;
int c,j;
void main() {
    srand(time(NULL));
    printf("shuffle 0..n-1 demo\n");
    for (n=1;n<=5;n++) {/* 测试1~5个元素 */
        printf("_____n=%d_____\n",n);
        j=1;
        for (c=1;c<=n;c++) j=j*c;/* j为n! */
        j*=n*2;
        for (c=1;c<=j;c++) {/* 测试n*2*n!次 */
            for (i=0;i<n;i++) d[i]=i;/* 填写0~n-1 */
            for (i=n;i>0;i--) {/* 打乱0~n-1 */
                a=i-1;b=rand()%i;
                if (a!=b) {t=d[a];d[a]=d[b];d[b]=t;}
            }
            printf("%04d:",c);
            for (i=0;i<n;i++) printf("%d",d[i]);
            printf("\n");
        }
    }
    printf("shuffle 1..n demo\n");
    for (n=1;n<=5;n++) {/* 测试1~5个元素 */
        printf("_____n=%d_____\n",n);
        j=1;
        for (c=1;c<=n;c++) j=j*c;/* j为n! */
        j*=n*2;
        for (c=1;c<=j;c++) {/* 测试n*2*n!次 */
            for (i=1;i<=n;i++) d[i]=i;/* 填写1~n */
            for (i=n;i>1;i--) {/* 打乱1~n */
                a=i;b=rand()%i+1;
                if (a!=b) {t=d[a];d[a]=d[b];d[b]=t;}
            }
            printf("%04d:",c);
            for (i=1;i<=n;i++) printf("%d",d[i]);
            printf("\n");
        }
    }
}

#14


引用 13 楼 zhao4zhong1 的回复:
楼主概念不清啊!
随机必然有重复,所谓“不重复随机”不是随机,而是洗牌。
洗牌请参考下面:
C/C++ code
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int d[6];
int i,n,a,b,t;
int c,j;
void main() {
    srand(time(NULL));
    printf……

不好意思,
首先,我的要求是取得随机数去掉其中重复数值,这与随机数有没有重复没关系吧,而且你说的也有问题,随机数也有可能没重复的。
其次,这段代码探讨的是思路与效率问题。
最后,我不知道你运行过这段代码没,得到这段代码想要的结果了?