From 70ece8d334485af47edfb5bf3049bef2cf5f4df6 Mon Sep 17 00:00:00 2001 From: Brad Fitzpatrick Date: Mon, 26 Oct 2009 14:03:54 -0700 Subject: Speed up Uri.getQueryParameter by allocating less. Sample hierarchial URL, from my ContactsProvider test case: content://com.android.contacts/data?account_name=braddroid%40gmail.com&account_type=com.google.GAIA&caller_is_syncadapter=true Without this patch: (fetching the "account_name" parameter) 10000 iters: 0.5293 ms average 10000 iters: 0.5119 ms average 10000 iters: 0.5158 ms average With this patch, rewriting it to not allocate memory (no implicit StringBuilder), but still no caching: 1) when it needs to decode something (i.e account_name above; allocates memory) 50000 iters: 0.28724 ms average 50000 iters: 0.31774 ms average 50000 iters: 0.28764 ms average 2) when it doesn't need to decode (and thus allocate memory, i.e. account_type above) 50000 iters: 0.0954 ms average 50000 iters: 0.09124 ms average 50000 iters: 0.09088 ms average --- .../src/com/android/unit_tests/UriTest.java | 29 ++++++++++++++++++++++ 1 file changed, 29 insertions(+) (limited to 'tests') diff --git a/tests/AndroidTests/src/com/android/unit_tests/UriTest.java b/tests/AndroidTests/src/com/android/unit_tests/UriTest.java index d17e2c3..42066d9 100644 --- a/tests/AndroidTests/src/com/android/unit_tests/UriTest.java +++ b/tests/AndroidTests/src/com/android/unit_tests/UriTest.java @@ -541,4 +541,33 @@ public class UriTest extends TestCase { assertEquals(nestedUrl, Uri.decode(uri.getQueryParameters("nested").get(0))); } + + public void testGetQueryParameterEdgeCases() { + Uri uri; + + // key at beginning of URL + uri = Uri.parse("http://test/").buildUpon() + .appendQueryParameter("key", "a b") + .appendQueryParameter("keya", "c d") + .appendQueryParameter("bkey", "e f") + .build(); + assertEquals("a b", uri.getQueryParameter("key")); + + // key in middle of URL + uri = Uri.parse("http://test/").buildUpon() + .appendQueryParameter("akeyb", "a b") + .appendQueryParameter("keya", "c d") + .appendQueryParameter("key", "e f") + .appendQueryParameter("bkey", "g h") + .build(); + assertEquals("e f", uri.getQueryParameter("key")); + + // key at end of URL + uri = Uri.parse("http://test/").buildUpon() + .appendQueryParameter("akeyb", "a b") + .appendQueryParameter("keya", "c d") + .appendQueryParameter("key", "y z") + .build(); + assertEquals("y z", uri.getQueryParameter("key")); + } } -- cgit v1.1