小编Mar*_*ins的帖子

ExecuteScalar,ExecuteReader和ExecuteNonQuery有什么区别?

当我们使用这三种时,有哪些不同的情况?我应该在哪里使用,哪个不应该?

asp.net ado.net

99
推荐指数
5
解决办法
17万
查看次数

查询postgres中表的授予

如何在postgres中查询授予对象的所有GRANTS?

例如,我有表"mytable":

GRANT SELECT, INSERT ON mytable TO user1
GRANT UPDATE ON mytable TO user2 
Run Code Online (Sandbox Code Playgroud)

我需要一些能给我的东西:

user1: SELECT, INSERT
user2: UPDATE
Run Code Online (Sandbox Code Playgroud)

sql postgresql grant

82
推荐指数
6
解决办法
9万
查看次数

L1缓存缺失的成本是多少?

编辑:为了参考目的(如果有人偶然发现这个问题),伊戈尔奥斯特罗夫斯基写了一篇关于缓存未命中的精彩帖子.它讨论了几个不同的问题并显示了示例数字. 结束编辑

我做了一些测试<long story goes here>,我想知道性能差异是否是由于内存缓存未命中.以下代码演示了该问题,并将其归结为关键时序部分.以下代码有几个循环,以随机顺序访问内存,然后按升序地址顺序访问内存.

我在XP机器(使用VS2005:cl/O2编译)和Linux机器(gcc -Os)上运行它.两者产生了相似的时间 这些时间以毫秒为单位.我相信所有循环都在运行并且未被优化(否则它将"立即"运行).

*** Testing 20000 nodes
Total Ordered Time: 888.822899
Total Random Time: 2155.846268

这些数字有意义吗?差异主要是由于L1缓存未命中还是还有其他事情发生?存在20,000 ^ 2个存储器访问,并且如果每个都是高速缓存未命中,则每个未命中约3.2纳秒.我测试的XP(P4)机器是3.2GHz,我怀疑(但不知道)有一个32KB的L1缓存和512KB的L2.有20,000个条目(80KB),我假设没有大量的L2未命中.所以这就是(3.2*10^9 cycles/second) * 3.2*10^-9 seconds/miss) = 10.1 cycles/miss.这对我来说似乎很高兴.也许不是,或者我的数学很糟糕.我尝试用VTune测量缓存未命中,但我得到了BSOD.现在我无法连接到许可证服务器(grrrr).

typedef struct stItem
{
   long     lData;
   //char     acPad[20];
} LIST_NODE;



#if defined( WIN32 )
void StartTimer( LONGLONG *pt1 )
{
   QueryPerformanceCounter( (LARGE_INTEGER*)pt1 );
}

void StopTimer( LONGLONG t1, double *pdMS )
{
   LONGLONG t2, llFreq;

   QueryPerformanceCounter( (LARGE_INTEGER*)&t2 );
   QueryPerformanceFrequency( (LARGE_INTEGER*)&llFreq );
   *pdMS …
Run Code Online (Sandbox Code Playgroud)

c caching memory-access

68
推荐指数
4
解决办法
3万
查看次数

将字符串拆分为列表,但保持拆分模式

目前我按模式拆分字符串,如下所示:

outcome_array=the_text.split(pattern_to_split_by)
Run Code Online (Sandbox Code Playgroud)

问题是我分裂的模式本身总是被省略.

如何让它包含拆分模式本身?

ruby string split

14
推荐指数
2
解决办法
6365
查看次数

可以强制Delphi threadvar内存被释放吗?

我一直在追逐在Delphi 2007 for Win32中构建的DLL中的内存泄漏.如果在卸载DLL时线程仍然存在,则不会释放threadvar变量的内存(在卸载DLL时没有对DLL进行活动调用).

问题:有没有办法让Delphi释放与threadvar变量相关的内存?它并不像不使用它们那么简单.许多现有的Delphi组件都使用它们,所以即使DLL没有明确声明它们,它最终也会使用它们.

一些细节 我已经将它跟踪到一个LocalAlloc调用,该调用是为了响应threadvar变量的使用而发生的,这是Delphi在Win32中围绕线程本地存储的"包装器".好奇的是,分配调用是在Delphi源文件sysinit.pas中.相应的LocalFree调用仅针对获取DLL_THREAD_DETACH调用的线程发生.如果应用程序中有多个线程并卸载DLL,则不会DLL_THREAD_DETACH调用每个线程.DLL得到了一个DLL_PROCESS_DETACH没有别的东西; 我相信这是预期和有效的.因此,在其他线程上进行的任何线程本地存储分配都会泄露.

我用一个简短的C程序重新创建它,启动几个"工作"线程.它在主线程上加载DLL(通过LoadLibrary),然后调用工作线程上的导出函数.从Delphi DLL导出的函数为threadvar整数变量赋值并返回.然后C程序卸载DLL(通过主线程上的FreeLibrary)并重复.在大约32,000次迭代之后,Process Explorer中显示的进程内存使用量增长到130MB以上.我也用umdh更准确地验证了它.UMDH显示每个实例丢失24个字节.但Process Explorer中的130MB似乎表明每次迭代大约4K; 我猜测基于此每次都会泄露4K片段,但我不确定.

为了澄清,这里是threadvar声明和整个导出函数:

threadvar
   threadint : integer;

function Startup( ulID: LongWord; hValue: Longint ): LongWord; stdcall;
begin
   threadint := 123;
   Result := 0;
end;
Run Code Online (Sandbox Code Playgroud)

谢谢.

delphi dll multithreading memory-leaks

12
推荐指数
2
解决办法
3777
查看次数

寻找线程同步性能问题的解释

当使用内核对象来同步在不同CPU上运行的线程时,使用Windows Server 2008 R2相对于其他操作系统可能会有一些额外的运行时成本吗?

编辑:通过答案发现,问题还应该包括"在较低的CPU利用率水平下运行"这一短语.我在自己对这个问题的回答中包含了更多信息.

背景

我研究的产品使用共享内存和信号量进行进程间的通信(当两个进程在同一台机器上运行时).有关Windows Server 2008 R2(我在此之后缩短为Win2008R2)的性能问题的报告使我发现在Win2008R2上的两个线程之间共享信号量与其他操作系统相比相对较慢.

再现它

我能够通过在两个线程上同时运行以下代码来重现它:

for ( i = 0; i < N; i++ )
  {
  WaitForSingleObject( globalSem, INFINITE );
  ReleaseSemaphore( globalSem, 1, NULL );
  }
Run Code Online (Sandbox Code Playgroud)

使用可以双启动到Windows Server 2003 R2 SP2和Windows Server 2008 R2的计算机进行测试,上面的代码片段在Win2003R2机器上运行速度比Win2008R2快7倍(Win2003R2为3秒,Win2008R2为21秒).

简单版本的测试

以下是上述测试的完整版本:

#include <windows.h>
#include <stdio.h>
#include <time.h>


HANDLE gSema4;
int    gIterations = 1000000;

DWORD WINAPI testthread( LPVOID tn )
{
   int count = gIterations;

   while ( count-- )
      {
      WaitForSingleObject( gSema4, INFINITE );
      ReleaseSemaphore( gSema4, …
Run Code Online (Sandbox Code Playgroud)

c performance multithreading synchronization windows-server-2008

9
推荐指数
1
解决办法
1427
查看次数

WaitForSingleObject是否可用作内存屏障?

昨天关于双重检查锁定的一个问题引发了一连串的想法,让我不确定一个简单的情况.在下面的代码中,是否可以达到printf"不再同步"?在这个简单的例子中,值可能在同一个缓存行上,所以我认为它不太可能(假设开始时可能性> 0%).

如果答案是"不,这是不可能的.",那么我的后续问题是,相当可预见的:为什么不呢?直到昨天我的想法纠结并缠绕在多线程轴上,我认为代码是安全的.但现在我想知道是什么阻止从缓存中读取其中一个变量pa或的变量pb.如果pa, pb指向简单的全局整数变量而不是malloc内存,那会有关系吗?WaitForSingleObject调用是否提供内存屏障?或者指针是否应声明为volatile?这么多问题,句子很少.

更新:我最终找到的信息明确指出,信号同步对象的函数确实使用了内存屏障.应该是显而易见的,但我找不到明确的答案.所以我可以再次欺骗自己相信我理解这一切.

int i1 = 0;
int i2 = 0;
int reads = 0;
int done = 0;
int *pa = NULL;
int *pb = NULL;
HANDLE hSync = NULL;

DWORD WriteThread( LPVOID pvParam )
{
   while( !done )
      {
      WaitForSingleObject( hSync, INFINITE );
      (*pa)++;
      (*pb)++;
      ReleaseSemaphore( hSync, 1, NULL );
      }
   return 0;
}

DWORD ReadThread( LPVOID pvParam )
{
   while( !done )
      {
      WaitForSingleObject( …
Run Code Online (Sandbox Code Playgroud)

c memory winapi multithreading

6
推荐指数
1
解决办法
944
查看次数

从巨大的文本文件中剥离文本块

我的任务非常痛苦,我想知道是否有人可以提供帮助.

我们的供应商提供了一个SNMP mib文件(txt).不幸的是,这个文件很多都已经过时,需要为我们的监控应用程序删除.

我一直在尝试手工完成这项工作,但它已超过800,000行,并且它正在削弱我的生存意愿.

结构类似于:

-- /*********************************************************************************/
-- /* MIB table for Hardware                                                        */
-- /* Valid from: 543.44                                                            */
-- /* Deprecated from: 600.3                                                        */
-- /*********************************************************************************/

Some text 
some text 
Some text

-- /*********************************************************************************/
-- /* MIB table for Hardware                                                        */
-- /* Valid from: 543.44                                                            */
-- /*********************************************************************************/

Some text 
some text 
Some text

-- /*********************************************************************************/
-- /* MIB table for Hardware                                                        */
-- /* Valid from: 364.44                                                            */
-- /* Deprecated from: 594.3                                                        */
-- /*********************************************************************************/ …
Run Code Online (Sandbox Code Playgroud)

awk sed

6
推荐指数
1
解决办法
180
查看次数

强制Visual Studio 2010使用源服务器查找文件

当我使用Visual Studio 2010调试故障转储文件(本机代码)时,它会尝试从原始构建文件夹加载C/C++源文件(并提供消息"The source file is different from when the module was built. Would you like the debugger to use it anyway?").消息是正确的; 该文件不是正确的版本.

我想VS2010要做的是使用源服务器检出源文件.如果该文件当前不存在于其原始构建位置,则VS2010将正确使用源服务器并检索该文件的相应修订版本(来自Subversion).为了强制它检查正确的版本,我必须从原始构建位置物理删除该文件.

作为旁注,VS2005可以按照需要工作(好吧......正如我所希望的那样,也许不像其他人想要的那样).无论原始构建文件夹中是否存在该文件的副本,VS2005将始终从源代码管理中检出正确的修订版.

我相信问题归结为以下之一:

  • 是否有某种设置可以改变VS2010查找源文件的优先级?
  • 或者,是否可以让VS2010提供选项/选项来检查有问题的源文件?(目前我在这种情况下看到的唯一选择是浏览它.)
  • 或者是否可以从搜索中完全排除特定路径(文件夹)?

debugging visual-studio-2010

5
推荐指数
1
解决办法
580
查看次数