mirror of
https://github.com/jart/cosmopolitan.git
synced 2025-05-23 05:42:29 +00:00
Improve performance of printf functions
This commit is contained in:
parent
b107d2709f
commit
dc6d11a031
39 changed files with 577 additions and 650 deletions
|
@ -40,6 +40,8 @@ TEST(uint64toarray_radix10, test) {
|
|||
char buf[21];
|
||||
EXPECT_EQ(1, uint64toarray_radix10(0, buf));
|
||||
EXPECT_STREQ("0", buf);
|
||||
EXPECT_EQ(4, uint64toarray_radix10(1024, buf));
|
||||
EXPECT_STREQ("1024", buf);
|
||||
EXPECT_EQ(20, uint64toarray_radix10(UINT64_MAX, buf));
|
||||
EXPECT_STREQ("18446744073709551615", buf);
|
||||
EXPECT_EQ(19, uint64toarray_radix10(INT64_MIN, buf));
|
||||
|
|
|
@ -38,8 +38,9 @@
|
|||
#include "libc/testlib/testlib.h"
|
||||
#include "libc/x/x.h"
|
||||
|
||||
static char buffer[128];
|
||||
#define Format(...) gc(xasprintf(__VA_ARGS__))
|
||||
char buffer[1000];
|
||||
/* #define Format(...) gc(xasprintf(__VA_ARGS__)) */
|
||||
#define Format(...) (snprintf(buffer, sizeof(buffer), __VA_ARGS__), buffer)
|
||||
|
||||
TEST(sprintf, test_space_flag) {
|
||||
EXPECT_STREQ(" 42", Format("% d", 42));
|
||||
|
@ -593,32 +594,14 @@ TEST(snprintf, testFixedWidthString_wontOverrunInput) {
|
|||
TEST(snprintf, testFixedWidthStringIsNull_wontOverrunBuffer) {
|
||||
int N = 3;
|
||||
char *buf = malloc(N + 1);
|
||||
EXPECT_EQ(6, snprintf(buf, N + 1, "%.*s", pushpop(N), pushpop(NULL)));
|
||||
EXPECT_BINEQ(u"(nu ", buf);
|
||||
EXPECT_EQ(6, snprintf(buf, N + 1, "%#.*s", pushpop(N), pushpop(NULL)));
|
||||
EXPECT_BINEQ(u"(nu ", buf);
|
||||
EXPECT_EQ(4, snprintf(buf, N + 1, "%`.*s", pushpop(N), pushpop(NULL)));
|
||||
EXPECT_BINEQ(u"NUL ", buf);
|
||||
EXPECT_EQ(4, snprintf(buf, N + 1, "%`#.*s", pushpop(N), pushpop(NULL)));
|
||||
EXPECT_BINEQ(u"NUL ", buf);
|
||||
free(buf);
|
||||
}
|
||||
|
||||
TEST(snprintf, testFixedWidthStringIsNull_wontLeakMemory) {
|
||||
int N = 16;
|
||||
char *buf = malloc(N + 1);
|
||||
memset(buf, 0, N + 1);
|
||||
EXPECT_EQ(6, snprintf(buf, N + 1, "%.*s", pushpop(N), pushpop(NULL)));
|
||||
EXPECT_BINEQ(u"(null) ", buf);
|
||||
memset(buf, 0, N + 1);
|
||||
EXPECT_EQ(6, snprintf(buf, N + 1, "%#.*s", pushpop(N), pushpop(NULL)));
|
||||
EXPECT_BINEQ(u"(null) ", buf);
|
||||
memset(buf, 0, N + 1);
|
||||
EXPECT_EQ(4, snprintf(buf, N + 1, "%`.*s", pushpop(N), pushpop(NULL)));
|
||||
EXPECT_BINEQ(u"NULL ", buf);
|
||||
memset(buf, 0, N + 1);
|
||||
EXPECT_EQ(4, snprintf(buf, N + 1, "%`#.*s", pushpop(N), pushpop(NULL)));
|
||||
EXPECT_BINEQ(u"NULL ", buf);
|
||||
EXPECT_EQ(3, snprintf(buf, N + 1, "%.*s", pushpop(N), pushpop(NULL)));
|
||||
EXPECT_STREQ("(nu", buf);
|
||||
EXPECT_EQ(3, snprintf(buf, N + 1, "%#.*s", pushpop(N), pushpop(NULL)));
|
||||
EXPECT_STREQ("(nu", buf);
|
||||
EXPECT_EQ(3, snprintf(buf, N + 1, "%`'.*s", pushpop(N), pushpop(NULL)));
|
||||
EXPECT_STREQ("NUL", buf);
|
||||
EXPECT_EQ(3, snprintf(buf, N + 1, "%`#.*s", pushpop(N), pushpop(NULL)));
|
||||
EXPECT_STREQ("NUL", buf);
|
||||
free(buf);
|
||||
}
|
||||
|
||||
|
@ -640,7 +623,9 @@ TEST(palandprintf, precisionStillRespectsNulTerminatorIfNotEscOrRepr) {
|
|||
}
|
||||
|
||||
BENCH(palandprintf, bench) {
|
||||
EZBENCH2("ascii", donothing, Format(VEIL("r", "hiuhcreohucreo")));
|
||||
EZBENCH2("ascii %s", donothing, Format("%s", VEIL("r", "hiuhcreohucreo")));
|
||||
EZBENCH2("ascii %`'s", donothing, Format("%`'s", VEIL("r", "hiuhcreohucre")));
|
||||
EZBENCH2("utf8 %s", donothing, Format("%s", VEIL("r", "hi (╯°□°)╯")));
|
||||
EZBENCH2("snprintf %hs", donothing, Format("%hs", VEIL("r", u"hi (╯°□°)╯")));
|
||||
EZBENCH2("snprintf %ls", donothing, Format("%ls", VEIL("r", L"hi (╯°□°)╯")));
|
||||
|
@ -648,6 +633,8 @@ BENCH(palandprintf, bench) {
|
|||
EZBENCH2("23 %d", donothing, Format("%d", VEIL("r", 23)));
|
||||
EZBENCH2("INT_MIN %x", donothing, Format("%x", VEIL("r", INT_MIN)));
|
||||
EZBENCH2("INT_MIN %d", donothing, Format("%d", VEIL("r", INT_MIN)));
|
||||
EZBENCH2("LONG_MIN %x", donothing, Format("%lx", VEIL("r", LONG_MIN)));
|
||||
EZBENCH2("LONG_MIN %d", donothing, Format("%ld", VEIL("r", LONG_MIN)));
|
||||
EZBENCH2("23 int64toarray", donothing, int64toarray_radix10(23, buffer));
|
||||
EZBENCH2("INT_MIN int64toarray", donothing,
|
||||
int64toarray_radix10(INT_MIN, buffer));
|
||||
|
|
|
@ -20,6 +20,8 @@
|
|||
#include "libc/nexgen32e/crc32.h"
|
||||
#include "libc/nexgen32e/x86feature.h"
|
||||
#include "libc/str/str.h"
|
||||
#include "libc/testlib/ezbench.h"
|
||||
#include "libc/testlib/hyperion.h"
|
||||
#include "libc/testlib/testlib.h"
|
||||
|
||||
#define FANATICS "Fanatics"
|
||||
|
@ -40,12 +42,6 @@ TEST(crc32c, test) {
|
|||
strlen(hyperion) - strlen(FANATICS)));
|
||||
}
|
||||
|
||||
TEST(crc32c_pure, test) {
|
||||
EXPECT_EQ(0, crc32c_pure(0, "", 0));
|
||||
EXPECT_EQ(crc32c_pure(0, "hello", 5), crc32c_pure(0, "hello", 5));
|
||||
EXPECT_EQ(0xe3069283, crc32c_pure(0, "123456789", 9));
|
||||
EXPECT_EQ(0x6d6eefba, crc32c_pure(0, hyperion, strlen(hyperion)));
|
||||
EXPECT_EQ(0x6d6eefba, crc32c_pure(crc32c_pure(0, FANATICS, strlen(FANATICS)),
|
||||
hyperion + strlen(FANATICS),
|
||||
strlen(hyperion) - strlen(FANATICS)));
|
||||
BENCH(crc32c, bench) {
|
||||
EZBENCH2("crc32c", donothing, crc32c(0, kHyperion, kHyperionSize));
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue