TLS 线程局部变量, 网上一堆文章说比用锁要好, 为什么我测试了后和 CRITICAL_SECTION 差不多呢

Sandrer 2018-10-25 11:18:20
之前开发的程序一直在用 TLS, 各线程玩各自的东西
但这段时间要优化一个服务端程序, 就想着能不能再优化一下 TLS 的东西
然后就写了下面的代码, 但运行结果看来, TLS 和 CRITICAL_SECTION 差不多的时间
反而很多时候要比 CS 慢.........................
难道是我打开的方式不对???

#include "stdafx.h"
#include <process.h>

static DWORD m_dwTLSIndex = 0;

static CRITICAL_SECTION m_lock;

#define MAX_ALLOCATE 1000000u
static volatile DWORD m_dwAllocCount = 0;

struct BUFFER
{
BUFFER *next;
BYTE data[16];
};

struct BUFFER_LIST
{
BUFFER_LIST *next;
BUFFER *pBuffers;
};

static BUFFER_LIST *m_pBufferList = NULL;
static BUFFER *m_pBuffers = NULL;

uintptr_t __stdcall _thread1(void *)
{
BUFFER *p;
BUFFER_LIST *pList = (BUFFER_LIST *)malloc(sizeof(BUFFER_LIST));
ZeroMemory(pList, sizeof(BUFFER_LIST));

::EnterCriticalSection(&m_lock);
pList->next = m_pBufferList;
m_pBufferList = pList;
::LeaveCriticalSection(&m_lock);

::TlsSetValue(m_dwTLSIndex, pList);

for (;;)
{
p = (BUFFER *)malloc(sizeof(BUFFER));
p->data[0] = 0;

pList = (BUFFER_LIST *)::TlsGetValue(m_dwTLSIndex);
p->next = pList->pBuffers;
pList->pBuffers = p;

if (InterlockedIncrement(&m_dwAllocCount) >= MAX_ALLOCATE)
break;
}

return 0;
}

uintptr_t __stdcall _thread2(void *)
{
BUFFER *p;

for (;;)
{
p = (BUFFER *)malloc(sizeof(BUFFER));
p->data[0] = 0;

::EnterCriticalSection(&m_lock);
p->next = m_pBuffers;
m_pBuffers = p;
::LeaveCriticalSection(&m_lock);

if (InterlockedIncrement(&m_dwAllocCount) >= MAX_ALLOCATE)
break;
}

return 0;
}

void TestTLSData()
{
::InitializeCriticalSection(&m_lock);

ULONGLONG ullBegin, ullEnd;
SYSTEM_INFO si;
::GetSystemInfo(&si);

DWORD dwThread = 0;
DWORD dwCount = si.dwNumberOfProcessors;
HANDLE *phThreads = new HANDLE[dwCount + 1];
ZeroMemory(phThreads, sizeof(HANDLE) * (dwCount + 1));

m_dwTLSIndex = ::TlsAlloc();

::GetSystemTimeAsFileTime((LPFILETIME)&ullBegin);

dwThread = 0;
while (dwCount--)
phThreads[dwThread++] = (HANDLE)_beginthreadex(NULL, 0, _thread1, NULL, 0, NULL);

::WaitForMultipleObjects(dwThread, phThreads, TRUE, INFINITE);

::GetSystemTimeAsFileTime((LPFILETIME)&ullEnd);
printf("Used TLS: %u.%04u ms\n", (DWORD)(ullEnd - ullBegin) / 10000, (DWORD)(ullEnd - ullBegin) % 10000);
while (dwThread--)
::CloseHandle(phThreads[dwThread]);

::TlsFree(m_dwTLSIndex);

BUFFER *n, *p;
//BUFFER_LIST *pNext;
//BUFFER_LIST *pList = m_pBufferList;
//while (pList != NULL)
//{
// pNext = pList->next;

// p = pList->pBuffers;
// while (p)
// {
// n = p->next;
// free(p);
// p = n;
// }

// free(pList);
// pList = pNext;
//}

m_dwAllocCount = 0;
dwCount = si.dwNumberOfProcessors;
ZeroMemory(phThreads, sizeof(HANDLE) * (dwCount + 1));

::GetSystemTimeAsFileTime((LPFILETIME)&ullBegin);

dwThread = 0;
while (dwCount--)
phThreads[dwThread++] = (HANDLE)_beginthreadex(NULL, 0, _thread2, NULL, 0, NULL);

::WaitForMultipleObjects(dwThread, phThreads, TRUE, INFINITE);

::GetSystemTimeAsFileTime((LPFILETIME)&ullEnd);
printf("Not used TLS: %u.%04u ms\n", (DWORD)(ullEnd - ullBegin) / 10000, (DWORD)(ullEnd - ullBegin) % 10000);
while (dwThread--)
::CloseHandle(phThreads[dwThread]);

//p = m_pBuffers;
//while (p)
//{
// n = p->next;
// free(p);
// p = n;
//}

::DeleteCriticalSection(&m_lock);

system("pause");
}
...全文
177 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
tls本来就应该比cs方式要慢,因为它本身是为了安全而准备,而不是为效率,如果安全性要求高你可以用,如果安全性要求不高,那还是cs的形式最为方便快捷,你可以详细了解下tls的协议就知道了,本协议为了安全性付出了很多时间上的代价,比如加密,比如额外的协议层数据
赵4老师 2018-10-26
  • 打赏
  • 举报
回复
无profiler不要谈效率!!尤其在这个云计算、虚拟机、模拟器、CUDA、多核 、多级cache、指令流水线、多种存储介质、……满天飞的时代!
标题付费自习室管理系统的设计与实现研究AI更换标题第1章引言介绍付费自习室管理系统的研究背景、意义、国内外发展现状及论文创新点。1.1研究背景与意义阐述付费自习室兴起背景及管理系统的重要性。1.2国内外发展现状分析国内外付费自习室及其管理系统的发展情况。1.3论文研究方法及创新点概述本文采用的研究方法及系统设计的创新之处。第2章相关理论总结和评述与付费自习室管理系统相关的现有理论。2.1管理信息系统理论介绍管理信息系统的基本概念、构成及作用。2.2用户需求分析理论阐述用户需求分析的方法和步骤。2.3系统设计理论介绍系统设计的原则、方法和流程。第3章付费自习室管理系统需求分析详细描述付费自习室管理系统的功能需求和非功能需求。3.1功能需求分析分析用户管理、座位预订、费用结算等核心功能需求。3.2非功能需求分析阐述系统性能、安全性、易用性等非功能需求。3.3用户调研与反馈介绍用户调研方法及收集到的用户反馈意见。第4章付费自习室管理系统设计详细介绍付费自习室管理系统的设计方案和实现过程。4.1系统架构设计给出系统的整体架构、模块划分及交互流程。4.2数据库设计设计数据库结构,包括表结构、字段定义及关系。4.3界面设计展示系统界面设计,包括布局、色彩搭配及交互元素。第5章付费自习室管理系统实现与测试阐述付费自习室管理系统的实现过程和测试结果。5.1系统实现技术介绍系统开发所采用的技术栈和工具。5.2系统测试方法阐述系统测试的方法、步骤及测试用例设计。5.3系统测试结果与分析展示系统测试结果,包括功能测试、性能测试等,并进行分析。第6章结论与展望总结本文的研究成果,并对未来研究方向进行展望。6.1研究结论概括付费自习室管理系统的设计成果及实施效果。6.2展望指出系统存在的不足及未来改进方向,提出后续研究建议。
标题宾馆客房管理系统的设计与实现研究AI更换标题第1章引言介绍宾馆客房管理系统的研究背景、研究意义、国内外研究现状、论文方法及创新点。1.1研究背景与意义阐述宾馆客房管理系统对提升管理效率和服务质量的重要性。1.2国内外研究现状分析国内外宾馆客房管理系统的研究现状与发展趋势。1.3研究方法及创新点概述本文采用的研究方法及系统设计的创新之处。第2章相关理论介绍宾馆客房管理系统设计涉及的相关理论和技术。2.1数据库管理理论阐述数据库设计的基本原理和管理方法。2.2软件开发理论介绍软件开发的基本流程和项目管理方法。2.3用户界面设计理论讨论用户界面设计原则和用户体验优化方法。第3章宾馆客房管理系统需求分析详细分析宾馆客房管理系统的功能需求和性能需求。3.1功能需求分析列举系统应具备的主要功能,如预订、入住、退房等。3.2性能需求分析分析系统在响应时间、并发处理等方面的性能要求。3.3用户需求分析从用户角度出发,分析用户对系统的期望和需求。第4章宾馆客房管理系统设计详细介绍系统的整体架构和各个模块的设计方案。4.1系统架构设计给出系统的整体架构图,包括前端、后端和数据库等部分。4.2数据库设计详细介绍数据库的设计方案,包括表结构、字段设置等。4.3模块设计分别介绍各个模块的设计思路和功能实现方法。第5章宾馆客房管理系统实现与测试介绍系统的实现过程和测试方法,验证系统的功能性和性能。5.1系统实现阐述系统的开发环境、开发工具和实现步骤。5.2系统测试介绍系统的测试方法、测试用例和测试结果。5.3性能优化根据测试结果,对系统进行性能优化和改进。第6章结论与展望总结本文的研究成果,并对未来研究方向进行展望。6.1研究结论概括本文的主要研究成果和系统的实际应用效果。6.2展望指出系统存在的不足之处和未来改进的方向。

15,467

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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