【发布时间】:2016-05-25 16:01:19
【问题描述】:
你好,
我想测量在我的 PC 上运行的应用程序和通过无线网络连接的手机之间的传输速度。我的手机正在运行 Android 并充当回声服务器。它通过套接字接收到的所有内容都会回显。
在 PC 端,我编写了一个有两个线程的小应用程序。一个生成数据包(128K,但我可以控制它)并将它们发送到手机(WriteThread)。数据包的开头有一个时间戳值,显示数据包的发送时间。发送整个数据包后,我的写线程等待发出事件信号。当接收到整个数据包时,读取线程会发出该事件的信号。读取线程从数据包中提取时间戳并计算往返延迟 - 数据包到达手机并返回所用的时间。
我的两边(手机和电脑)的插座都是非阻塞的。
我的程序是用 C++ 编写的:
// WriteThread
int totalBytesWritten = 0;
int bytesWritten = 0;
const int packetSize = 128 * 1024;
char pBuffer[packetSize];
int packetCount = 1000;
int iterations = packetCount;
while ( iterations > 0 )
{
if ( totalBytesWritten < bytesWritten )
{
if ( generatePacketEvent.isSignaled() )
{
GenerateBuffer( pBuffer, packetSize );
generatePacketEvent.Reset();
totalBytesWritten = 0;
iterations --;
}
int bytesWritten = CSocketUtils::Write( m_socket, pBuffer + totalBytesWritten, packetSize - totalBytesWritten );
if ( bytesWritten > 0 ) totalBytesWritten += bytesWritten;
}
}
// Read thread
int totalBytesRead = 0;
int bytesRead = 0;
int expectedPackets = 100;
int packetsReceived = 0;
const int packetSize = 128 * 1024;
char pBuffer[packetSize];
while ( packetsReceived < packetsExpected )
{
if ( totalBytesReceived < packetSize )
{
bytesRead = CSocketUtils::Read( m_socket, pBuffer + totalBytesRead, packetSize - totalBytesRead );
if ( bytesRead > 0 )
{
totalBytesRead += bytesRead;
}
}
else
{
totalBytesRead = 0;
packetReceivedEvent.Signal();
uint32_t timestamp = 0;
memcpy( ×tamp, pBuffer, sizeof( uint32_t ) );
uint32_t roundtrip = CurrentTimeMilliseconds() - timestamp;
}
}
// Generate Buffer data
void GenerateBuffer( char* pBuffer, int size )
{
uint32_t timestamp = CurrentTimeMilliseconds();
memcpy( pBuffer, ×tamp, sizeof( uint32_t ) );
for (int i = sizeof( uint32_t ); i < size; i ++ )
{
pBuffer[i] = rand() % 255;
}
}
如何衡量我的应用程序向/从手机发送/接收数据的速度?
我无法更改手机的 Echo 应用程序来修改它正在接收的数据包!所以没有办法在手机端添加时间戳。
起初,我在累积 CSocketUtils::Write(调用 send())返回的字节,并让计时器测量一秒。当计时器到期时,我会将累积的字节数作为写入速度。但这产生了 12MB/s,我花了 30 秒才发送 12MB 的数据,所以没有办法是准确的。然后我开始测量发送整个数据包所花费的时间,但这又没有帮助,因为这样我正在测量操作系统填充套接字缓冲区的速度:(
【问题讨论】:
-
您需要测量延迟还是吞吐量?您是只对往返时间感兴趣,还是对单程时间感兴趣?
-
我对往返延迟和吞吐量都很感兴趣。所以两者都是。
标签: android c++ multithreading sockets