最近、Nexus 7 タブレットで Android アプリを開発するタスクを与えられました。これは、wifi を使用して tcp ソケットを介して PC に接続されます。
特に、画像のストリーム (圧縮されていない BMP など) をタブレットに渡す必要がありました。そこで、帯域幅を確認する簡単なテストを行いましたが、結果にがっかりしました。Wi-Fi 信号源のすぐ前にタブレットを置いて座っています。接続速度は毎秒 54Mb と書かれていますが、テスト結果を考慮すると、毎秒最大 16Mb しか得られません。
テストコード:
PC:
public static void main(String[] args) throws Exception
{
Socket socket = new Socket(androidIpAddr, port);
OutputStream output = socket.getOutputStream();
byte[] bytes = new byte[1024 * 100]; // 10K
for (int i = 0; i < bytes.length; i++) {
bytes[i] = 12;
} // fill the bytes
// send them again and again
while (true) {
output.write(bytes);
}
}
アンドロイド:
public class MyActivity extends Activity {
/**
* Called when the activity is first created.
*/
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
new Thread(new Runnable()
{
public void run()
{
ServerSocket server = new ServerSocket(port);
Socket socket = server.accept();
InputStream input = socket.getInputStream();
long total = 0;
long start = System.currentTimeMillis();
byte[] bytes = new byte[1024 * 100]; // 10K
// read the data again and again
while (true)
{
int read = input.read(bytes);
total += read;
long cost = System.currentTimeMillis() - start;
if (cost > 100)
{
double megaBytes = (total / (1024.0 * 1024));
double seconds = (cost / 1000.0);
System.out.println("Read " + total + " bytes, speed: " + megaBytes / seconds + " MB/s");
start = System.currentTimeMillis();
total = 0;
}
}
}
}).start();
}
}
私は何を逃したのですか?