贝网博客

我的分类
流水记事
源码下载
Asp.net
其它
数据库
Javascript
.Net技术
我的相册
友情链接
博客园
CSDN博客
Start0
最新回复
嗷嗷的cCC
fasdfasdf
[:..
lz这个东西好厉害,我..
哈哈,好照片
不错,以前一直用黄色..
终于找到支持ff的修正..
终于找到支持ff的修正..
新鲜性
看看,试试,好不好使。
 日志列表    
本站一共有博客83条,当前显示81条
 发表于:2012-08-10 15:21:54
更新于:2012-10-29 16:32:39

1、使用C#封装好的方法截屏:
Size sz = Screen.PrimaryScreen.Bounds.Size;
int width = sz.Width + 300;// 加300是为了测试双显示器时能否正常截屏
int height = sz.Height;
using (Bitmap bit = new Bitmap(width, height))
using (Graphics g = Graphics.FromImage(bit))
{
    g.CopyFromScreen(this.Location, new Point(0, 0), bit.Size);
    bit.Save(@"c:\b.png");
    g.Dispose();
}

2、调用系统API进行截屏
先定义外部方法:
[DllImport("gdi32.dll")]
static extern bool BitBlt(IntPtr hdcDest, int xDest, int yDest, int
wDest, int hDest, IntPtr hdcSource, int xSrc, int ySrc, CopyPixelOperation rop);
[DllImport("user32.dll")]
static extern bool ReleaseDC(IntPtr hWnd, IntPtr hDc);
[DllImport("gdi32.dll")]
static extern IntPtr DeleteDC(IntPtr hDc);
[DllImport("gdi32.dll")]
static extern IntPtr DeleteObject(IntPtr hDc);
[DllImport("gdi32.dll")]
static extern IntPtr CreateCompatibleBitmap(IntPtr hdc, int nWidth, int nHeight);
[DllImport("gdi32.dll")]
static extern IntPtr CreateCompatibleDC(IntPtr hdc);
[DllImport("gdi32.dll")]
static extern IntPtr SelectObject(IntPtr hdc, IntPtr bmp);
[DllImport("user32.dll")]
public static extern IntPtr GetDesktopWindow();
[DllImport("user32.dll")]
public static extern IntPtr GetWindowDC(IntPtr ptr);

然后截屏代码如下:
Size sz = Screen.PrimaryScreen.Bounds.Size;
int width = sz.Width + 300; // 加300是为了测试双显示器时能否正常截屏
int height = sz.Height;

//调用API截屏
IntPtr hDesk = GetDesktopWindow();
IntPtr hSrce = GetWindowDC(hDesk);
IntPtr hDest = CreateCompatibleDC(hSrce);
IntPtr hBmp = CreateCompatibleBitmap(hSrce, width, height);
IntPtr hOldBmp = SelectObject(hDest, hBmp);
if (BitBlt(hDest, 0, 0, width, height, hSrce, 0, 0, CopyPixelOperation.SourceCopy | CopyPixelOperation.CaptureBlt))
{
    using (Bitmap bmp = Image.FromHbitmap(hBmp))
    {
        SelectObject(hDest, hOldBmp);
        DeleteObject(hBmp);
        DeleteDC(hDest);
        ReleaseDC(hDesk, hSrce);
        bmp.Save(@"c:\a.png");
        bmp.Dispose();
    }
}

 发表于:2012-08-02 11:36:25

根据下面的ID,可以帮助我们快速识别由 Microsoft? Windows Server 2003 操作系统生成的安全事件,究竟意味着什么事件出现了。
一、帐户登录事件
下面显示了由“审核帐户登录事件”安全模板设置所生成的安全事件。
672:已成功颁发和验证身份验证服务 (AS) 票证。
673:授权票证服务 (TGS) 票证已授权。TGS 是由 Kerberos v5 票证授权服务 (TGS) 颁发的票证,允许用户对域中的特定服务进行身份验证。
674:安全主体已更新 AS 票证或 TGS 票证。
675:预身份验证失败。用户键入错误的密码时,密钥发行中心 (KDC) 生成此事件。
676:身份验证票证请求失败。在 Windows XP Professional 或 Windows Server 家族的成员中不生成此事件。
677:TGS 票证未被授权。在 Windows XP Professional 或 Windows Server 家族的成员中不生成此事件。
678:帐户已成功映射到域帐户。
681:登录失败。尝试进行域帐户登录。在 Windows XP Professional 或 Windows Server 家族的成员中不生成此事件。
682:用户已重新连接至已断开的终端服务器会话。
683:用户未注销就断开终端服务器会话。
二、帐户管理事件
下面显示了由“审核帐户管理”安全模板设置所生成的安全事件。
624:用户帐户已创建。
627:用户密码已更改。
628:用户密码已设置。
630:用户帐户已删除。
631:全局组已创建。
632:成员已添加至全局组。
633:成员已从全局组删除。
634:全局组已删除。
635:已新建本地组。
636:成员已添加至本地组。
637:成员已从本地组删除。
638:本地组已删除。
639:本地组帐户已更改。
641:全局组帐户已更改。
642:用户帐户已更改。
643:域策略已修改。
644:用户帐户被自动锁定。
645:计算机帐户已创建。
646:计算机帐户已更改。
647:计算机帐户已删除。
648:禁用安全的本地安全组已创建。
注意:
从正式名称上讲,SECURITY_DISABLED 意味着该组不能用来授权访问检查。
649:禁用安全的本地安全组已更改。
650:成员已添加至禁用安全的本地安全组。
651:成员已从禁用安全的本地安全组删除。
652:禁用安全的本地组已删除。
653:禁用安全的全局组已创建。
654:禁用安全的全局组已更改。
655:成员已添加至禁用安全的全局组。
656:成员已从禁用安全的全局组删除。
657:禁用安全的全局组已删除。
658:启用安全的通用组已创建。
659:启用安全的通用组已更改。
660:成员已添加至启用安全的通用组。
661:成员已从启用安全的通用组删除。
662:启用安全的通用组已删除。
663:禁用安全的通用组已创建。
664:禁用安全的通用组已更改。
665:成员已添加至禁用安全的通用组。
666:成员已从禁用安全的通用组删除。
667:禁用安全的通用组已删除。
668:组类型已更改。
684:管理组成员的安全描述符已设置。
注意:
在域控制器上,每隔 60 分钟,后台线程就会搜索管理组的所有成员(如域、企业和架构管理员),并对其应用一个固定的安全描述符。该事件已记录。
685:帐户名称已更改。
三、目录服务访问事件
下面显示了由"审核目录服务访问"安全模板设置所生成的安全事件。
566:发生了一般对象操作。
四、登录事件ID
528:用户成功登录到计算机。
529:登录失败。试图使用未知的用户名或已知用户名但错误密码进行登录。
530:登录失败。试图在允许的时间外登录。
531:登录失败。试图使用禁用的帐户登录。
532:登录失败。试图使用已过期的帐户登录。
533:登录失败。不允许登录到指定计算机的用户试图登录。
534:登录失败。用户试图使用不允许的密码类型登录。
535:登录失败。指定帐户的密码已过期。
536:登录失败。Net Logon 服务没有启动。
537:登录失败。由于其他原因登录尝试失败。
注意:
在某些情况下,登录失败的原因可能是未知的。
538:用户的注销过程已完成。
539:登录失败。试图登录时,该帐户已锁定。
540:用户成功登录到网络。
541:本地计算机与列出的对等客户端身份(已建立安全关联)之间的主要模式 Internet 密钥交换 (IKE) 身份验证已完成,或者快速模式已建立了数据频道。
542:数据频道已终止。
543:主要模式已终止。
注意:
如果安全关联的时间限制(默认为 8 小时)过期、策略更改或对等终止,则会发生此情况。
544:由于对等客户端没有提供有效的证书或者签名无效,造成主要模式身份验证失败。
545:由于 Kerberos 失败或者密码无效,造成主要模式身份验证失败。
546:由于对等客户端发送的建议无效,造成 IKE 安全关联建立失败。接收到的程序包包含无效数据。
547:在 IKE 握手过程中,出现错误。
548:登录失败。来自信任域的安全标识符 (SID) 与客户端的帐户域 SID 不匹配。
549:登录失败。在林内进行身份验证时,所有与不受信任的名称空间相关的 SID 将被筛选出去。
550:可以用来指示可能的拒绝服务 (DoS) 攻击的通知消息。
551:用户已启动注销过程。
552:用户使用明确凭据成功登录到作为其他用户已登录到的计算机。
682:用户已重新连接至已断开的终端服务器会话。
683:用户还未注销就断开终端服务器会话。注意:当用户通过网络连接到终端服务器会话时,就会生成此事件。该事件出现在终端服务器上。
五、对象访问事件
下面显示了由"审核对象访问"安全模板设置所生成的安全事件。
560:访问权限已授予现有的对象。
562:指向对象的句柄已关闭。
563:试图打开一个对象并打算将其删除。
注意:
当在 Createfile() 中指定了 FILE_DELETE_ON_CLOSE 标记时,此事件可以用于文件系统。
564:受保护对象已删除。
565:访问权限已授予现有的对象类型。
567:使用了与句柄关联的权限。
注意:
创建句柄时,已授予其具体权限,如读取、写入等。使用句柄时,最多为每个使用的权限生成一个审核。
568:试图创建与正在审核的文件的硬链接。
569:授权管理器中的资源管理器试图创建客户端上下文。
570:客户端试图访问对象。
注意:
在此对象上发生的每个尝试操作都将生成一个事件。
571:客户端上下文由授权管理器应用程序删除。
572:Administrator Manager(管理员管理器)初始化此应用程序。
772:证书管理器已拒绝挂起的证书申请。
773:证书服务已收到重新提交的证书申请。
774:证书服务已吊销证书。
775:证书服务已收到发行证书吊销列表 (CRL) 的请求。
776:证书服务已发行 CRL。
777:已制定证书申请扩展。
778:已更改多个证书申请属性。
779:证书服务已收到关机请求。
780:已开始证书服务备份。
781:已完成证书服务备份。
782:已开始证书服务还原。
783:已完成证书服务还原。
784:证书服务已开始。
785:证书服务已停止。
786:已更改证书服务的安全权限。
787:证书服务已检索存档密钥。
788:证书服务已将证书导入其数据库中。
789:证书服务审核筛选已更改。
790:证书服务已收到证书申请。
791:证书服务已批准证书申请并已颁发证书。
792:证书服务已拒绝证书申请。
793:证书服务将证书申请状态设为挂起。
794:证书服务的证书管理器设置已更改。
795:证书服务中的配置项已更改。
796:证书服务的属性已更改。
797:证书服务已将密钥存档。
798:证书服务导入密钥并将其存档。
799:证书服务已将证书颁发机构 (CA) 证书发行到 Microsoft Active Directory? 目录服务。
800:已从证书数据库删除一行或多行。
801:角色分离已启用。
六、审核策略更改事件
下面显示了由"审核策略更改"安全模板设置所生成的安全事件。
608:已分配用户权限。
609:用户权限已删除。
610:与其他域的信任关系已创建。
611:与其他域的信任关系已删除。
612:审核策略已更改。
613:Internet 协议安全 (IPSec) 策略代理已启动。
614:IPSec 策略代理已禁用。
615:IPSec 策略代理已更改。
616:IPSec 策略代理遇到一个可能很严重的故障。
617:Kerberos v5 策略已更改。
618:加密数据恢复策略已更改。
620:与其他域的信任关系已修改。
621:已授予帐户系统访问权限。
622:已删除帐户的系统访问权限。
623:按用户设置审核策略。
625:按用户刷新审核策略。
768:检测到两个林的名称空间元素之间有冲突。
注意:
当两个林的名称空间元素重叠时,解析属于其中一个名称空间元素的名称时,将发生歧义。这种重叠也称为冲突。并非所有的参数对每一项类型都有效。例如,对于类型为 TopLevelName 的项,有些字段无效,如 DNS 名称、NetBIOS 名称和 SID。
769:已添加受信任的林信息。
注意:
当更新林信任信息并且添加了一个或多个项时,将生成此事件消息。为每个添加、删除或修改的项生成一个事件消息。如果在林信任信息的一个更新中添加、删除或修改了多个项,则为生成的所有事件消息指派一个唯一标识符,称为操作 ID。该标识符可以用来确定生成的多个事件消息是一个操作的结果。并非所有的参数对每一项类型都有效。例如,对于类型为 TopLevelName 的项,有些参数是无效的,如 DNS 名称、NetBIOS 名称和 SID。
770:已删除受信任的林信息。
注意:
请参见事件 769 的事件描述。
771:已修改受信任的林信息。
注意:
请参见事件 769 的事件描述。
805:事件日志服务读取会话的安全日志配置。
七、特权使用事件
下面显示了由"审核特权使用"安全模板设置所生成的安全事件。
576:指定的特权已添加到用户的访问令牌中。
注意:
当用户登录时生成此事件。
577:用户试图执行需要特权的系统服务操作。
578:特权用于已经打开的受保护对象的句柄。
八、详细的跟踪事件
下面显示了由"审核过程跟踪"安全模板设置所生成的安全事件。
592:已创建新进程。
593:进程已退出。
594:对象句柄已复制。
595:已获取对象的间接访问权。
596:数据保护主密钥已备份。
注意:
主密钥用于 CryptProtectData 和 CryptUnprotectData 例程以及加密文件系统 (EFS)。每次新建主密钥时都进行备份。(默认设置为 90 天。)通常由域控制器备份主密钥。
597:数据保护主密钥已从恢复服务器恢复。
598:审核过的数据已受保护。
599:审核过的数据未受保护。
600:已分配给进程主令牌。
601:用户试图安装服务。
602:已创建计划程序任务。
九、审核系统事件
下面显示了由"审核系统事件"安全模板设置所生成的系统事件。
512:Windows 正在启动。
513:Windows 正在关机。
514:本地安全机制机构已加载身份验证数据包。
515:受信任的登录过程已经在本地安全机构注册。
516:用来列队审核消息的内部资源已经用完,从而导致部分审核数据丢失。
517:审核日志已清除。
518:安全帐户管理器已加载通知数据包。
519:进程正在使用无效的本地过程调用 (LPC) 端口,试图伪装客户端并向客户端地址空间答复、读取或写入。
520:系统时间已更改。
注意:
在正常情况下,该审核出现两次。

转载自:http://nba20717zcx.blog.51cto.com/343890/429947

 发表于:2012-05-03 11:30:25
更新于:2012-07-27 11:00:26

这几天开发了一个Web站点,主要用于给其它站点做接口数据返回,在提交压力测试时,经常内存增长到1G后,溢出了,因为程序本身确实会加载不少缓存数据,而服务器本身是Windows2003 32位的操作系统,最大只支持2g内存,通过参考页面:http://support.microsoft.com/?kbID=810371,在boot.ini里增加启动参数:/3gb /Userva=3030
从而让程序可以使用到3G内存,然后继续提交压力测试

结果测试时,内存依旧持续增长,增长到2G后,又内存溢出了,至此,怀疑程序有内存泄露

找了一个win7版本的任务管理器,拷贝到服务器上,在内存达到2G时,创建了一个w3wp进程的dump(下面的创建转储文件)

抓下来dump文件后,在本地用Windbg加载sos.dll进行分析,
.load C:\WINDOWS\microsoft.net\framework\v2.0.50727\sos.dll

通过!dumpheap -stat命令,发现占用内存最大的3个对象是:
6611b1b0  5027584    241324032 System.Web.SessionState.InProcSessionState
66149064  5027602    361987344 System.Web.Caching.CacheEntry
79330b24  5575562    378271928 System.String

各占用了241M、361M、378M,因为事先知道String占用这么大是正常的,所以要去分析另外2个对象,在Windbg里通过:  !dumpheap -type System.Web.Caching.CacheEntry  命令,查看所有具体的CacheEntry地址等信息,这个会很多,数据一出来,马上按Ctrl+Break,数据大致如下
 0:000> !dumpheap -type System.Web.Caching.CacheEntry
------------------------------
Heap 0
 Address       MT     Size
106837a8 044b3ac4       72    
107b0de0 044b3ac4       72    
107b1e74 044b3ac4       72    
107bdc14 044b3ac4       72    
107bdef8 044b3ac4       72    
107c1290 044b3ac4       72    
107c1370 044b3ac4       72    
107c142c 044b3ac4       72    
107c20f8 044b3ac4       72    

先找第一个地址分析:
0:000> !do 106837a8
Name: System.Web.Caching.CacheEntry
MethodTable: 044b3ac4
EEClass: 044aac24
Size: 72(0x48) bytes
 (C:\WINDOWS\assembly\GAC_32\System.Web\2.0.0.0__b03f5f7f11d50a3a\System.Web.dll)
Fields:
      MT    Field   Offset                 Type VT     Attr    Value Name
02469134  400140c        4        System.String  0 instance 10683740 _key
030fb350  400140d        c          System.Byte  1 instance       16 _bits
03154d18  400140e        8         System.Int32  1 instance -1350406618 _hashCode
02466d54  4001415       10        System.Object  0 instance 10683794 _value
0321ab48  4001416       1c      System.DateTime  1 instance 106837c4 _utcCreated
0321ab48  4001417       24      System.DateTime  1 instance 106837cc _utcExpires
0321dda4  4001418       2c      System.TimeSpan  1 instance 106837d4 _slidingExpiration
030fb350  4001419        d          System.Byte  1 instance 4294967295 _expiresBucket
044b3964  400141a       34 ...g.ExpiresEntryRef  1 instance 106837dc _expiresEntryRef
030fb350  400141b        e          System.Byte  1 instance        2 _usageBucket
044b3a6c  400141c       38 ...ing.UsageEntryRef  1 instance 106837e0 _usageEntryRef
0321ab48  400141d       3c      System.DateTime  1 instance 106837e4 _utcLastUpdate
044b32f0  400141e       14 ...g.CacheDependency  0 instance 00000000 _dependency
02466d54  400141f       18        System.Object  0 instance 00000000 _onRemovedTargets
0321ab48  4001412      1e4      System.DateTime  1   shared   static NoAbsoluteExpiration
    >> Domain:Value  000dd050:NotInit  0012ad78:1616ba94 <<
0321dda4  4001413      1e8      System.TimeSpan  1   shared   static NoSlidingExpiration
    >> Domain:Value  000dd050:NotInit  0012ad78:1616baa4 <<
0321dda4  4001414      1ec      System.TimeSpan  1   shared   static OneYear
    >> Domain:Value  000dd050:NotInit  0012ad78:1616bab4 <<

然后再看_key的值
0:000> !do 10683740
Name: System.String
MethodTable: 02469134
EEClass: 02a42780
Size: 82(0x52) bytes
 (C:\WINDOWS\assembly\GAC_32\mscorlib\2.0.0.0__b77a5c561934e089\mscorlib.dll)
String: f2029612887/recommendservice.svc

再看_value的值
0:000> !do 10683794
Name: System.Web.Configuration.MapPathCacheInfo
MethodTable: 047026d0
EEClass: 04776bb8
Size: 20(0x14) bytes
 (C:\WINDOWS\assembly\GAC_32\System.Web\2.0.0.0__b03f5f7f11d50a3a\System.Web.dll)
Fields:
      MT    Field   Offset                 Type VT     Attr    Value Name
02469134  40018d4        4        System.String  0 instance 10683dfc MapPathResult
0320bdb8  40018d5        c       System.Boolean  1 instance        1 Evaluated
030f0498  40018d6        8     System.Exception  0 instance 00000000 CachedException
0:000> !do 10683dfc
Name: System.String
MethodTable: 02469134
EEClass: 02a42780
Size: 88(0x58) bytes
 (C:\WINDOWS\assembly\GAC_32\mscorlib\2.0.0.0__b77a5c561934e089\mscorlib.dll)
String: E:\wwwroot\Web\recommendservice.svc
看来第一个CacheEntry保存的是一个虚拟路径和物理路径的对应关系,接着分析下一个CacheEntry的数据
如此类推发现
!do 107b0de0得到的也是一个文件路径缓存数据
!do 107b1e74得到System.Web.Security.FileSecurityDescriptorWrapper,看起来像是文件安全配置说明
!do 107bdc14得到一个key为jbj1dejrlaibnmfyrnqldwk45的System.Web.SessionState.InProcSessionState对象
!do 107bdef8得到一个key为jfd2qmyinc5sgpk55b2nks4rw的System.Web.SessionState.InProcSessionState对象
107c1290、107c1370、107c142c、107c20f8等大部分CacheEntry保存的都是InProcSessionState对象

由此可见,占用内存第二大的,都引用了占用内存第三大的InProcSessionState对象,
而Asp.net的Session默认是保持20分钟,压力测试时,在20分钟内创建的Session全部被保持,无法被GC回收,从而内存不断增长,最终导致内存溢出了

马上咨询压力测试人员,果然是压力测试发起了所有连接,都是新连接,
通过修改压力测试方案,复用创建的连接,而不是发起 新连接,果然内存占用在400M左右,增长也极其缓慢

最后的修改方案,因为此站点仅作为接口使用,不会使用到Session,直接在Web.config增加配置:<sessionState mode="Off"></sessionState>
关闭Session,再进行压力测试,内存基本不会增长

回复:1  发表于:2012-06-17 08:44:08
更新于:2012-07-13 15:32:29

今天淘宝又开始抢红包了,下面是抢红包代码,同样也是在Firefox或Chrome的控制台执行,IE8的控制台也可以
var btn = document.getElementById('award_btn');
function alert(a){}
setInterval(function () {btn.click();}, 2000);

抢红包网页:http://www.taobao.com/go/act/sale/summer2012-yr.php

 

 

如果是ie浏览器,先打开网页:http://www.tmall.com/
然后在地址栏里输入:javascript:setInterval(function(){document.getElementById("J_Lucky").click();},100);void(0);
ok了,让它自己慢慢抽去吧,只不过中奖率太低,我昨天只自动抽到10元,上面的代码是每秒抽10次

也可以用Firefox,安装上Firebug插件,在Firebug里的脚本调试器里输入脚本:
setInterval(function(){document.getElementById("J_Lucky").click();},100);
也可以自动抽哦,呵呵

主要是看到网上很多兄弟写一堆代码,太复杂了,哥提供个简单版本的,呵呵

上面的代码是昨天的,看来淘宝今天加班在修改这个页面,今天最新的抢红包脚本修改为:
setInterval(function(){document.getElementById("J_Lucky").nextSibling.click();},100);

回复:8  发表于:2009-11-03 11:33:49
更新于:2012-07-13 15:32:03

今天正式开通俺的博客,这个博客是俺写的,还是比较简陋的,功能也比较少,需要不断的完善,嗯。
如果哪位兄弟姐妹,对俺这个博客的源代码感兴趣呢,可以联系俺,俺的mail: youbl@126.com,俺不介意开源我的博客程序。
基于不少朋友想要代码,这里帖出下载地址,参考最下方的下载,后台管理要手动输入地址才能进入,初始密码为beinet,希望朋友们帮我找出问题,并反馈给我,我们一起进步吧

更新日志:
2011.11.18:评论太长,版面未换行问题;站点搜索功能;允许博客设置为首页不显示,仅分类页显示
2011.08.10:后台登录失效问题,是因为虚拟机上的machineKey经常改变造成,手动在web.config里指定就ok了,参考:http://blog.csdn.net/vasun/article/details/5100743
2011.03.02:修改显示排序,增加更新时间显示,增加回复时的表情功能
2010.08.20:修改日志编辑时,\转义成js变量时的bug;调整日志编辑界面
2010.05.23:增加相册评论功能;修改日志评论显示为按时间正序(原为按时间倒序);
2010.05.15:增加相册功能;

待修改日志:
1、站点静态化制作,提高访问速度;2、日志可对应多个分类;

源代码下载  已下载

先写这些吧。
下面放上我和我老婆的靓照一张,嘿嘿:
beinet的主人夫妻俩

 发表于:2012-07-12 13:15:49

参考:http://technet.microsoft.com/zh-cn/library/cc737705(v=ws.10)
下面是我的简单翻译内容:

开启“保持HTTP连接”以保持连接开启
一个浏览器通常会发起多个请求以下载整个web页。为了提升服务器性能,大多数浏览器都会要求服务器在这多个请求之间保持连接状态,这个我就是Http协议里的“HTTP Keep-Alives”。

如果没有“HTTP Keep-Alives”,浏览器为页面里的多个对象发起多个web请求,比如页面里的图片,需要为这每一个图片发起一个独立的连接请求。这些附加的请求和连接,都需要额外的服务器响应和资源分配,大大降低了服务器的效率。这些附加的连接请求也会导致浏览器变的更慢或卡死(失去响应),尤其是通过网速慢的情况下。
“HTTP Keep-Alives”在IIS6.0里默认是开启的,这符合HTTP/1.1的规范要求。IIS会保持一个不活动的连接为开启状态,直到这个连接时间超过设置的值(这个默认值是120秒)。
如果你禁用“HTTP Keep-Alives”,服务器会忽略客户端浏览器保持连接开启的请求。因此,只有在特殊情况下才去禁用“HTTP Keep-Alives”,并且你必须完全清楚的明白这个会对你的服务器造成什么样的影响。
“HTTP Keep-Alives”需要集成安全或基于连接的身份验证服务,比如Windows的集成身份验证。对于使用Windows集成身份验证的站点,如果你禁用“HTTP Keep-Alives”,那么对这个站点的请求都会失败。
要验证你的服务器是不是启用了“HTTP Keep-Alives”,或要去开启“HTTP Keep-Alives”,请参考:
http://technet.microsoft.com/zh-cn/library/cc780771(v=ws.10)

 发表于:2012-06-28 09:10:57
更新于:2012-06-28 09:10:59

2012.6.28 天气阴转晴
手机充着电,突然响起了音乐,开始误以为是别人耳机声音太大,过了好久,拿起手机,发现是手机在响,进入设置把所有进程和服务都关闭了,音乐还在响,后来手机关机重启才正常,nnd,这手机也灵异了,手机是三星S5368,移动合约机,root过的
晚上去楼下新开张的罗马假日西餐厅吃饭,门口空荡荡的,以为没人,进去一看,里面都有7,8个人在排队呢,后来我和老婆选择坐吧台,不排队,点好餐,石锅拌饭还不错,不过点的那个批萨,等了40分钟,然后问服务员,告诉我们正在和面,坑爹啊,也不会事先告知一下?这时我后面一桌比我来的早的,也在催服务员,我们的生蚝快点,哈哈,估计他们等的更久,最后我的批萨和什么蜗牛都没上,选择退货,出去南后街那边帮小贝买了一包纸尿裤和一套衣服,回来觉得不饱,又去罗马假日西餐厅打包一份菠萝批萨,结果很难吃,估计我老婆很期待,最后也只吃了一点点,以后如果再去这家,绝对不会再点批萨了

回复:7  发表于:2010-11-23 16:55:24
更新于:2012-06-07 11:30:45

重新书写一下结论,代码中,如果经常使用List的Contains方法,建议修改为使用Dictionary的ContainsKey来代替,也可以使用下文中的SortedList,但是如果有比较多的插入操作,则不建议使用SortedList,而还是使用Dictionary,因为SortedList是线性存储,在修改数据时效率很低;
如果需要数组进行排序,可以改用SortedDictionary,这个的效率,我的测试结果比Dictionary差一点点,可以忽略,但是它是链表存储,占用内存会比SortedList大

本文介绍了C#中的List与SortedList的Contains方法源码,并进行了效率比较,得出结果是SortedList的Contains效率较高,但是插入数据时效率较低

做了个项目,是抽取不重复的随机数,一开始的代码(删减版)是:
static List<int> ok = new List<int>();
public static int GetRandom(){
    int ret = new Random(Guid.NewGuid().GetHashCode()).Next(1, 10000);
    while (ok.Contains(ret))
    {
        ret = new Random(Guid.NewGuid().GetHashCode()).Next(1, 1000);
    }
    ok.Add(ret);
    return ret;
}

后来觉得数组大了后,效率较低,研究了一下List<T>.Contains方法,定义如下:
for(int i=0; i<_size; i++) {
    if (c.Equals(_items[i], item)) return true;
}
return false;
就是循环整个数组去查找,后来想了一下,如果用排序好的数组,会不会效率更高呢?
又研究了一下SortedList<T>.ContainsKey方法,它调用了Array.BinarySearch方法,BinarySearch方法MSDN说明:
    使用指定的 IComparer<(Of <(T>)>) 泛型接口,在一维排序 Array 的某个元素范围中搜索值。定义大致如下:
private static int BinarySearch(T[] array, int index, int length, T value)
{
  int num = index;
  int num2 = (index + length) - 1;
  while (num <= num2)
  {
    int num4;
    int num3 = num + ((num2 - num) >> 1);
    num4 = array[num3].CompareTo(value);
    if (num4 == 0)
    {
      return num3;
    }
    if (num4 < 0)
    {
      num = num3 + 1;
    }
    else
    {
      num2 = num3 - 1;
    }
  }
  return ~num;
}
可以看出来是使用二分法查找,只是在Add的时候也要找到相应元素位置去Insert

通过几次大数据量的测试,在List.Add List.Contains 和 SortedList.Add SortedList.ContainsKey方法对比中,后者胜出,于是我的代码就改成了:
static SortedList<int, int> ok = new SortedList<int, int>();
public static int GetRandom(){
    int ret = new Random(Guid.NewGuid().GetHashCode()).Next(1, 1000);
    while (ok.ContainsKey(ret))
    {
        ret = new Random(Guid.NewGuid().GetHashCode()).Next(1, 1000);
    }
    ok.Add(ret, 1);
    return ret;
}

今天发现还有个SortedDictionary,汗,这个玩意的效率更高,测试代码如下,在下面的代码中SortedDictionary的时间都没超过100ms:
static void Main(string[] args)
{
    int time = 10000;
    Stopwatch w = new Stopwatch();
    for (var j = 0; j < 20; j++)
    {
        w.Reset();
        w.Start();
        for (int i = 0; i < time; i++)
            GetRandom2();
        w.Stop();
        Console.WriteLine("SortedDictionary耗时" + w.ElapsedMilliseconds);
        w.Reset();
        w.Start();
        for (int i = 0; i < time; i++)
            GetRandom();
        w.Stop();
        Console.WriteLine("SortedList耗时" + w.ElapsedMilliseconds);
        w.Reset();
        w.Start();
        for (int i = 0; i < time; i++)
            GetRandom3();
        w.Stop();
        Console.WriteLine("List耗时" + w.ElapsedMilliseconds);
    }
    Console.ReadLine();
}

private static int rndMax = int.MaxValue;
static SortedList<int, int> ok = new SortedList<int, int>();
public static void GetRandom()
{
    int ret = new Random(Guid.NewGuid().GetHashCode()).Next(1, rndMax);
    while (ok.ContainsKey(ret))
        ret = new Random(Guid.NewGuid().GetHashCode()).Next(1, rndMax);
    ok.Add(ret, 1);
}

static SortedDictionary<int, int> ok2 = new SortedDictionary<int, int>();
public static void GetRandom2()
{
    int ret = new Random(Guid.NewGuid().GetHashCode()).Next(1, rndMax);
    while (ok2.ContainsKey(ret))
        ret = new Random(Guid.NewGuid().GetHashCode()).Next(1, rndMax);
    ok2.Add(ret, 1);
}
static List<int> ok3 = new List<int>();
public static void GetRandom3()
{
    int ret = new Random(Guid.NewGuid().GetHashCode()).Next(1, rndMax);
    while (ok3.Contains(ret))
        ret = new Random(Guid.NewGuid().GetHashCode()).Next(1, rndMax);
    ok3.Add(ret);
}


©2008 Beinet.cn 版权所有