为什么同样的C++程序由32位改成64位后运行时间增加了一倍啊

ouyangbeiping 2018-04-23 11:43:35
如题,我有一个C++程序,要读MySQL数据库里的数据,于是我把原来32位的C++程序改成64位了,但是原来32位时20秒运行完的程序改成64位以后就变成40秒了,再改回32位以后就又变回20秒了,请问这是怎么一回事,我的电脑是64位系统啊。谢谢
...全文
1006 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
ouyangbeiping 2018-05-18
  • 打赏
  • 举报
回复
唉,好像也没什么解决办法,不过我把MySQL换成了32位的了,懒得管这档子事了
白色一大坨 2018-05-03
  • 打赏
  • 举报
回复
这情况没遇到过, 代码不长的话,发出来让大家长长见识?
千寻港生惠香 2018-05-03
  • 打赏
  • 举报
回复
我记得的确是不一样的,32位下4字节,64位8字节
ouyangbeiping 2018-05-03
  • 打赏
  • 举报
回复
引用 11 楼 phenix2009 的回复:
不妨变一下类型试试看时间是否会有变化
很多STL容器的成员是size_t类型的,例如vector的size()函数返回的就是一个size_t类型的变量,我的程序里就用到了很多STL容器,比如vector,map,valarray等等。 我试过用替换把程序中所有的size_t变量替换为int或者unsigned int类型,但是好像没什么用
ouyangbeiping 2018-05-03
  • 打赏
  • 举报
回复
引用 8 楼 phenix2009 的回复:
这情况没遇到过, 代码不长的话,发出来让大家长长见识?
代码太长了,我只能发一小段,这段代码是定义了一个叫matrix的模板类,它就是给一个valarray类型的变量两个size_t类型的变量作为其行和列,这样就可以把它当做是一种叫矩阵的类型。
#ifndef _MATRIX_H		//避免多次编译
#define _MATRIX_H
#include "stdafx.h"
#include <valarray>		//模板类valarray的标准头文件
#include "comm.h"		//公共头文件
#include <math.h>		//数学头文件
template <class _Ty>
class matrix			//矩阵类matrix
{
	typedef matrix<_Ty> _Myt;

 private:
	std::valarray<_Ty> m_Datas;	//定义一维数组对象m_Datas
	size_t m_stRow;		//矩阵行数变量
	size_t m_stCol;		//矩阵列数变量

 public:
	typedef _Ty value_type;

	//构造函数一(参数1, 2分别为矩阵的行与列数)
/******
矩阵类matrix的构造函数一
	构造函数中出现的m_Datas为valarray类的对象,申请stRow * stCol个单元,
单元内没赋值。对数组对象m_Datas使用了valarray类的构造函数:
				explicit valarray(size_t n)
    对私有变量m_stRow和m_stCol分别赋初值stRow, stCol。
******/
	matrix(size_t stRow, size_t stCol)
		: m_Datas(stRow * stCol),
			m_stRow(stRow), m_stCol(stCol)
	{
		m_Datas.resize(GetRowNum() * GetColNum(), _Ty(0));
		/*
		构造函数中出现的m_Datas为valarray类的对象,若在函数体内调用的
		resize(size_t n, const T& c = T())函数有两个参数(参阅valarray中的
		定义),第一个参数申请有矩阵行*列那么多元素个数的存储空间,第二个
		参数对这些申请的空间赋予具有模式T的初值0。如果不调用该函数,则缺省
		情况下m_Datas长度为0;另外,调用该函数但不使用第二个参数,则不会对
		m_Datas的任何一个元素赋初值。
		*/
	}

	//构造函数二(参数1为指向矩阵的指针,参数2, 3为矩阵行与列数)
/******
 矩阵类matrix的构造函数二
     对私有变量m_stRow和m_stCol分别赋初值stRow, stCol。
     对数组对象m_Datas使用了valarray类的构造函数:
				valarray(const _Ty *p, size_t n)
 m_Datas初始化的第一参数为矩阵rhs指针,第二个参数为rhs的元素总个数,
 即rhs行数*列数
******/
	matrix(const _Ty* rhs, size_t stRow, size_t stCol)
		: m_Datas(rhs, stRow * stCol),
			m_stRow(stRow), m_stCol(stCol)
	{
	}

	//构造函数三(拷贝构造函数,参数为对矩阵matrix的引用)
/******
 矩阵类matrix的构造函数三
     用引用矩阵rhs的数组对象m_Datas初始化matrix所定义对象的m_Datas,
 用引用矩阵rhs的行数rhs.GetRowNum()和列数rhs.GetColNum()分别初始化私
 有变量m_stRow和m_stCol
******/
	matrix(const _Myt& rhs)
		: m_Datas(rhs.m_Datas),
			m_stRow(rhs.GetRowNum()), m_stCol(rhs.GetColNum())
	{
	}

	size_t GetRowNum() const	//返回矩阵行数的函数
	{
		return m_stRow;
	}

	size_t GetColNum() const	//返回矩阵列数的函数
	{
		return m_stCol;
	}

	/*****
	    重载运算符(),获取二维矩阵某元素在一维数组m_Datas的位置
	(matrix类定义的矩阵实际上已经被转化为一维数组m_Datas)
	    当数组元素(i, j)在运算符左边(被写)时,使用_Ty& operator ()
	当数组元素(i, j)在运算符右边(被读)时,使用_Ty operator ()    
	*****/
	_Ty& operator () (size_t stRow, size_t stCol)
	{
		Assert(stRow < GetRowNum());	//断定stRow不超实际矩阵行值
		Assert(stCol < GetColNum());	//断定stCol不超实际矩阵列值

		return m_Datas[stRow * GetColNum() + stCol];
	}
/******
 重载()运算符,返回二维矩阵中元素(stRow, stCol)在一维数组中的位置
 stRow与stCol分别为矩阵某元素行与列的位置数
 当矩阵元素在运算符右边(被读)时使用
******/
	const _Ty operator () (size_t stRow, size_t stCol) const
	{
		Assert(stRow < GetRowNum());	//断定stRow不超实际矩阵行值
		Assert(stCol < GetColNum());	//断定stCol不超实际矩阵列值

		return m_Datas[stRow * GetColNum() + stCol];
	}
我猜测应该是因为这个类里头有不少size_t类型的变量,而size_t在32位里是unsigned int,在64位里是unsigned long long,所以运行时间不相同
白色一大坨 2018-05-03
  • 打赏
  • 举报
回复
不妨变一下类型试试看时间是否会有变化
白色一大坨 2018-05-03
  • 打赏
  • 举报
回复
那我可以问一下,用size_t这个类型定义变量的必要性是什么吗?
ouyangbeiping 2018-05-02
  • 打赏
  • 举报
回复
引用 5 楼 wldrzx 的回复:
编译器决定的long长度 分别打印下试试看
我明白了,是不是size_t类型在32位和64位下类型不同啊,32 位时是unsigned int类型,64位是unsigned long long类型,,所以两个平台下运行时间不一样,话说为什么size_t在32位和64位下类型不一样啊
千寻港生惠香 2018-04-27
  • 打赏
  • 举报
回复
编译器决定的long长度 分别打印下试试看
ouyangbeiping 2018-04-27
  • 打赏
  • 举报
回复
引用 2 楼 zhao4zhong1 的回复:
64/32=2 没毛病。
是不是跟我原来的32位程序里有很多long类型的变量有关啊,我听说long类型的在32位和64位里所占内存大不一样
轻箬笠 2018-04-24
  • 打赏
  • 举报
回复
不会,mark下。 个人觉得跟你的代码有关系,而跟数据库没关系
ouyangbeiping 2018-04-24
  • 打赏
  • 举报
回复
引用 1 楼 housecarl 的回复:
不会,mark下。 个人觉得跟你的代码有关系,而跟数据库没关系
确实跟数据库没关系,我把读数据库的程序注释掉了,让它读txt里的数据,结果64位的程序还是比32位运行速度增加了一倍
赵4老师 2018-04-24
  • 打赏
  • 举报
回复
64/32=2 没毛病。

24,855

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 工具平台和程序库
社区管理员
  • 工具平台和程序库社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧