Visual C++优化对大型数据集合的并发访问
2010-08-22 20:47:32 来源:WEB开发网示例服务器程序
有关示例程序的预备知识已经足够了。既提供一个实际的服务器应用程序示例,同时又要使其足够简单以便在一篇短文中加以介绍,这是很困难的,因此此处显示的示例有一点儿人为的痕迹。实际上,它根本不是一个真正的服务器应用程序。但是,我已经尝试虚构了一个可信的服务器应用程序方案,以便您能够参照实际方案来观察该应用程序,而无须运用太多的想象力。
Figure 6 Database Class
class Database
{
public:
Database(unsigned long numEntries);
unsigned long getNumEntries() const
{ return m_entries.size(); }
DBEntry& getEntry(unsigned long entryId) const
{ return *m_entries.at(entryId).get(); }
private:
typedef vector<auto_ptr<DBEntry> > DBEntryList;
typedef DBEntryList::const_iterator DBEntryIter;
DBEntryList m_entries;
};
class DBEntry
{
public:
DBEntry(unsigned long id, const string& value) :
m_id(id), m_value(value) {}
unsigned long getId() const
{ return m_id; }
const char* getValue() const
{ return m_value.c_str(); } // use of c_str causes cloning
void setValue(const string& newValue)
{ m_value = newValue.c_str(); } // use of c_str causes cloning
static void critSecMode(bool useSingleCritSec)
{ g_useSingleCritSec = useSingleCritSec; }
void acquire();
void release();
private:
unsigned long m_id;
string m_value;
static bool g_useSingleCritSec;
static CritSec g_singleCritSec;
static CritSecTable g_critSecTable;
};
示例 ConcurrencyDemo(或简称为 CD)模拟了简单的内存中数据库。DBEntry 类(参见图 6)代表该数据库中的一个项,由一个数值键和一些文本组成。客户端可以读取与给定键关联的文本,也可以更新特定键的文本。对象个数在启动时确定。
CD 示例包含一个辅助线程池。在实际情况下,这些线程将通过某种远程调用机制(如 TCP、DCOM、IIOP 或 SOAP — 如果您恰好正在使用尖端技术的话)获得来自客户端的请求。在该示例中,请求的生成经过了模拟,而不是真实的。
CD 示例采用了以下命令行参数:数据库中的项数、要执行的测试迭代的次数以及要使用的辅助线程的数目。如果指定了多个线程数目,则该程序将用每个数目运行一次测试。
Figure 7 main
typedef vector<unsigned long> NumberList;
typedef NumberList::const_iterator NumberIter;
int main(int argc, char* argv[])
{
try
{
// Interpret command-line arguments:
unsigned long numEntries;
unsigned long numIterations;
NumberList numThreadsList;
interpretCommandLine(argc, argv, numEntries, numIterations,
numThreadsList);
// Initialize the in-memory database:
Database db(numEntries);
// Print output header:
cout <<
"
"
"# of DB entries:," << numEntries << "
"
"# of iterations:," << numIterations << "
"
"All times in milli-seconds
"
"
"
"# Threads,Time (Single CritSec),Time (CritSec Table)"
<< flush;
// Run a test for each number of threads:
for (NumberIter i = numThreadsList.begin();
i != numThreadsList.end(); i++)
{
cout << '
' << *i;
DBEntry::critSecMode(true); // single critical section
doTest(db, numIterations, *i);
DBEntry::critSecMode(false); // critical section table
doTest(db, numIterations, *i);
}
cout << endl << endl;
}
catch (const Exception& e)
{
cout << e.getErrorMsg() << endl << endl;
}
catch (const exception& e)
{
cout << "std::exception: " << e.what() << endl << endl;
}
return 0;
}
- ››Visual Basic 2008 数学函数
- ››Visual Studio2005中Smart Device的问题
- ››Visual Studio 中根据数据库字段动态生成控件
- ››Visual Studio 11全新黑色主题
- ››Visual Studio 2011 Beta新特性(一):安装VS201...
- ››Visual Studio自定义调试窗体两个小技巧
- ››Visual Studio 2005 Team Edition for Database P...
- ››Visual C#两分钟搭建BHO IE钩子
- ››Visual C++优化对大型数据集合的并发访问
- ››优化精髓之商业性网站常遇见的问题和误区
- ››大型网站的域名分布策略
- ››优化增强您的Visual C++应用程序
更多精彩
赞助商链接