为什么我的Android线程如此之慢?

时间:2014-06-01 05:19:09

标签: java android multithreading

我一直在尝试编写一个扑克评分算法...它有七个嵌套的for循环来迭代七个扑克牌手的每个组合并得分。它当然是一个相当密集的循环......只有不到1.150亿个组合。

我的算法是正在进行的原始工作......但是我在桌面上的Eclipse中设法在大约8.5秒内正确评分所有手部组合。不错,我想......但Android模拟器中的相同算法在Android模拟器上需要17分钟,在HTC One XL上需要4分钟。

我已经做好了充分准备,让手机比我的新桌面运行速度慢......但不是30倍。

我的代码如下;

public void startThread() {

  Runnable runnable = new Runnable()
  {
    String bitString;
    byte[] bitCount = new byte[8192];
    byte[] isStraight = new byte[8192];
    boolean[] isFlush = new boolean[8912];

    int c, c1, c2, c3, c4, c5, c6, c7;
    int[] cards = new int[7];
    long sTime, eTime, score = 0;
    int[] handCount = new int[9];

    int pipMask;
    int[] pips = new int[6];
    int[] suit = new int[4];

@Override
public void run()
{
    for (c = 0; c < 8192; c++)
    {
        bitString = String.format("%13s", Integer.toBinaryString(c)).replace(" ","0");

    }

    sTime = System.currentTimeMillis();
    pips[0] = 8191;

    for (c1 = 0;      c1 < 46; c1++) {
    for (c2 = c1 + 1; c2 < 47; c2++) {
    for (c3 = c2 + 1; c3 < 48; c3++) {
    for (c4 = c3 + 1; c4 < 49; c4++) {
    for (c5 = c4 + 1; c5 < 50; c5++) { 
    for (c6 = c5 + 1; c6 < 51; c6++) {
    for (c7 = c6 + 1; c7 < 52; c7++) {

        --- code goes here ---

    }}}}}}}

    eTime = System.currentTimeMillis(); Log.d("end", "" + (eTime - sTime));

    message = handler.obtainMessage();
    bundle = new Bundle();
    bundle.putString("msgText", "Finished in " + (eTime - sTime));
    message.setData(bundle);
    handler.sendMessage(message);

  } // end run()

}; // end runnable

Thread myThread = new Thread(runnable); myThread.start();

} // end

我在Android中实现Threads时遇到了什么问题吗?

我担心它可能是字节和布尔数组的大小以及对线程施加的某种内存限制?

2 个答案:

答案 0 :(得分:1)

问题不在于线程。

问题不在于内存使用...因为它看起来相对较小,而且(AFAIK)在代码中正在完成工作的部分没有变化。

真正的问题是你有一个7级深度循环,每个变量都有很大的范围,你在循环中做了很多工作。

(提示:46 * 47 * 48 * 49 * 50 * 51 * 52 ......是一个相当大的数字。)

基本上,您的PC可以比典型的手机更快地运行Java代码。对我来说,30倍是合理的。


需要考虑的一件事是,HotSpot JVM中的JIT编译器要复杂得多,而且更具攻击性[&34;而不是典型的Android JIT编译器。如果有的话,这将放大硬件性能的差异。

答案 1 :(得分:1)

谢谢大家。一旦很明显我在Android中使用该线程没有任何内在错误,我就采用了rupps建议将代码移植到NDK / C ++。它现在快得多; 21秒vs 240秒。

即。超过10倍。

仍然没有足够快的速度来制作一个有用的应用程序...但尝试很有趣。 :)