##language:zh
'''
benchmarks
'''
-- Zoom.Quiet [<<DateTime(2004-08-09T23:57:27Z)>>]
<<TableOfContents>>
= 优化讨论 =

主要针对客户端
 * [[b%gnsq1]]--Benchmarks/gnsd|c 测试1

== 0729版本 ==
{{{
#!python
# -*- coding: utf-8 -*-
#
#
# $Id: ussc.py,v 1.3 2004/07/28 10:23:34 hd Exp $

from uss.message import usspmsg
from uss.protocols import ussp
from twisted.internet import reactor, protocol, defer
from time import clock

class USSClientProtocol(ussp.USSProtocol):
    def connectionMade(self):
        message = usspmsg.USSPMessage()
        message.setMsgName('connect')
        message.body.setField('system_id','123456')
        message.body.setField('auth_source','1234567890123456')
        message.body.setField('version',0x0100)
        message.body.setField('time_stamp','12345678')
        self.sendData(message.packed())

    def on_ussp_connect_resp(self, message):
        print "Connect successfully"
        global nownum
        global count
#        while (nownum < count):
        defer.succeed(self.testserver(str(nownum)))
#        nownum += 1
#        if(nownum >= count)
#	    self.disconnect()

    def on_ussp_terminate_resp(self, message):
        # 完事了!!!断开丫的连接
        self.transport.loseConnection()

    def on_ussp_mail_counter_resp(self, message):
        global getnum
        global lastuid
        global nownum
        lastuid = message.body.fields['uid']
        getnum += 1
        if getnum >= count:
            self.disconnect()
        nownum += 1
        defer.succeed(self.testserver(str(nownum)))

    def testserver(self,uid):
        message = usspmsg.USSPMessage()
        message.setMsgName('mail_counter')
        message.body.setField('uid',uid)           
        self.sendData(message.packed())
    
    def disconnect(self):
        message = usspmsg.USSPMessage()
        message.setMsgName('terminate')
        self.sendData(message.packed())

class USSClientFactory(protocol.ClientFactory):
    protocol = USSClientProtocol

    def clientConnectionFailed(self, connector, reason):
        print "Connection failed - goodbye!"
        reactor.stop()

    def clientConnectionLost(self, connector, reason):
        print "Connection lost"
        reactor.stop()
        pass

def main():
    f = USSClientFactory()
    global count
    count = 0xffff
    global nownum
    nownum = 0
    global lastuid
    lastuid = ''
    global getnum
    getnum = 0
    reactor.connectTCP("127.0.0.1", 7890, f)
    start = clock()
    reactor.run()
    print "测试数据:%10d 条" %nownum
    print "收到 %d 条" %getnum
    print "最后收到uid为:%s" %lastuid
    print "用时:%.2f 秒" %(clock()-start)
    print "每秒: %.2f 条" %(getnum / (clock()-start))

if __name__ == "__main__":
    main()
}}}

== 0731版本 ==
{{{
#!python
# -*- coding: utf-8 -*-
#
#
# $Id: ussc.py,v 1.5 2004/07/29 08:02:06 hd Exp $

from uss.message import usspmsg
from uss.protocols import ussp
from twisted.internet import reactor, protocol, defer
from time import clock
import Queue

# 定义了滑动窗口的大小
WINMAX = 1024

class USSClientProtocol(ussp.USSClientQueueProtocol):
    """建立一个USS客户机的协议处理"""
    def connectionMade(self):
        """连接成功后开始发送报文"""
        # 先发一个connect报文进行握手
        message = usspmsg.USSPMessage()
        message.setMsgName('connect')
        message.body.setField('system_id','123456')
        message.body.setField('auth_source','1234567890123456')
        message.body.setField('version',0x0100)
        message.body.setField('time_stamp','12345678')
        self.sendDataToQueue(message)
        ussp.USSClientQueueProtocol.connectionMade(self)

    def on_ussp_connect_resp(self, message):
        """服务器返回了connect的resp报文"""
        print "Connect successfully"
        defer.succeed(self.testserver())

    def on_ussp_terminate_resp(self, message):
        # 完事了!!!断开丫的连接
        self.transport.loseConnection()

    def on_ussp_mail_counter_resp(self, message):
        """服务器返回了mail_counter的resp报文"""
        global getnum
        global lastuid
        lastuid = message.body.fields['uid']
        getnum += 1

    def testserver(self):
        """向服务器发的测试报文"""

        global nownum
        global count
        
        while nownum < count:
            message = usspmsg.USSPMessage()
            message.setMsgName('mail_counter')
            message.body.setField('uid',str(nownum))  
            if self.factory.sendQueue.full():       
                self.call = reactor.callLater(0, self.testserver)
                return 
            else:
                self.factory.sendQueue.put_nowait(message)
                nownum += 1

        self.disconnect()
    
    def disconnect(self):
        """发完测试报文后发送terminate报文让服务器断开连接"""
        message = usspmsg.USSPMessage()
        message.setMsgName('terminate')
        self.sendDataToQueue(message)

class USSClientFactory(protocol.ClientFactory):
    protocol = USSClientProtocol

    def __init__(self):
        # 滑动窗口的大小
        self.WINMAX = WINMAX
        # 等待发送的报文队列
        self.sendQueue = Queue.Queue(self.WINMAX)
        # 已经发出的报文序列ID
        self.sendMsg = []
        # 使用的消息ID
        self.sequence = 1
        
    def clientConnectionFailed(self, connector, reason):
        print "Connection failed - goodbye!"
        reactor.stop()

    def clientConnectionLost(self, connector, reason):
        print "Connection lost"
        reactor.stop()
        pass

def main():
    f = USSClientFactory()
    global count
    count = 0xffff
    global nownum
    nownum = 0
    global lastuid
    lastuid = ''
    global getnum
    getnum = 0
    reactor.suggestThreadPoolSize(30)
    reactor.connectTCP("192.168.2.237", 7890, f)
    #reactor.connectTCP("127.0.0.1", 7890, f)
    start = clock()
    reactor.run()
    print "测试数据:%10d 条" %nownum
    print "收到 %d 条" %getnum
    print "最后收到uid为:%s" %lastuid
    print "用时:%.2f 秒" %(clock()-start)
    print "每秒:%f条" %(nownum / (clock()-start))

if __name__ == "__main__":
    main()
}}}
=== ussp.py ===
{{{
#!python
# -*- coding: utf-8 -*-
#
#
# $Id: ussp.py,v 1.2 2004/07/28 08:36:29 hd Exp $

"""Open Unified Storage System Protocol

Stability: None

@author: U{HD<mailto:hdcola@gmail.com>}

@see: Open Unified Storage System Protocol规范
"""
from uss.protocols import byteprotocol
from uss.message import usspmsg
from twisted.internet import reactor

class USSProtocol(byteprotocol.ByteMessageProtocol):
    """缺省USS协议实现"""
    def MessageReceived(self,packet):
        """接收到一条消息,对该消息进行处理"""
        message = usspmsg.USSPMessage()
        message.loadMessage(packet)
        # print message
        self.MessageProcess(message)

    def MessageProcess(self, message):
        """调用指定的方法来处理收到的消息"""
        method = getattr(self , "on_ussp_%s" % message.msgname, None)
        return method(message)

class USSClientQueueProtocol(USSProtocol):
    """使用滑动窗口队列的USS协议客户端实现"""

    def MessageReceived(self,packet):
        """接收到一条消息,确定该消息是否是已发送出的消息,
        如果是,从发送消息队列中清除该消息。然后按正常的流程执行下去。
        """
        message = usspmsg.USSPMessage()
        message.loadMessage(packet)
        # print message
        # 将发出的消息从队列中清楚
        self.factory.sendMsg.remove(message.head.sequence)
        self.MessageProcess(message)

    def connectionMade(self):
        """连接成功了,就可以启动发送线程了"""
        reactor.callInThread(self.sendQueueMesg)

    def sendDataToQueue(self, message):
        """将消息加入待发送队列"""
        if(not self.factory.sendQueue.full()):
            self.factory.sendQueue.put(message)
        else:
            self.call = reactor.callLater(0, self.sendDataToQueue, message)

    def sendQueueMesg(self):
        """将队列中的消息发送出去"""
        if (len(self.factory.sendMsg) < self.factory.WINMAX):
            while (not self.factory.sendQueue.empty()):
                message = self.factory.sendQueue.get()
                # 发送前设置消息的顺序号
                message.head.sequence = self.factory.sequence
                self.sendData(message.packed())
                # 将已经发送的消息放入已经发送的清单中
                self.factory.sendMsg.append(self.factory.sequence)
                self.factory.sequence += 1
        self.call = reactor.callLater(0, self.sendQueueMesg)
}}}