Last active
July 22, 2025 06:43
-
-
Save cpq/11e74cbbfe050ccd7984e8c07eed7dd0 to your computer and use it in GitHub Desktop.
Mongoose benchmark on STM32
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// This version measures poll execution time | |
void run_mongoose(void) { | |
struct mg_mgr mgr; // Mongoose event manager. Holds all connections | |
mg_mgr_init(&mgr); // Initialise event manager | |
mg_http_listen(&mgr, "http://0.0.0.0:80", ev_handler, NULL); | |
unsigned long counter = 0; | |
for (;;) { | |
uint64_t start = mg_millis(); | |
uint32_t val1 = SysTick->VAL; | |
mg_mgr_poll(&mgr, 1000); // Infinite event loop | |
uint32_t val2 = SysTick->VAL; | |
int diff = mg_millis() - start; | |
counter++; | |
if (num_conns(&mgr) > 1 && (counter % 3999) == 0) { | |
uint32_t load = SysTick->LOAD; | |
int diff2 = val1 > val2 ? val1 - val2 : val1 + load + 1 - val2; | |
MG_INFO(("--> %d %d %u", diff, diff2, load + 1)); | |
} | |
} | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
static void mg_hfn_push_data(struct mg_connection *c) { | |
size_t left = *(size_t *) c->data; // Bytes left to send | |
if (left > 0 && c->send.len < MG_IO_SIZE) { | |
const char chunk[] = "abcdefghijklmnopqrstubwxyz0123456789\n"; | |
size_t cs = sizeof(chunk) - 1; | |
while (left >= cs && c->send.len < MG_IO_SIZE * 2) { | |
mg_send(c, chunk, cs); | |
left -= cs; | |
} | |
if (left < cs) { | |
if (left > 0) mg_send(c, chunk, left - 1); | |
if (left > 0) mg_send(c, "\n", 1); | |
left = 0; | |
} | |
*(size_t *) c->data = left; | |
if (left == 0) c->is_resp = 0; | |
} | |
} | |
// Implement a simple server with the following endpoints: | |
// URI POST data Description | |
// /debug {"level": 0} Set server debug level, from 0 to 4 | |
// /?SIZE n/a Send a text response, default size is 256 | |
void ev_handler(struct mg_connection *c, int ev, void *ev_data) { | |
if (ev == MG_EV_HTTP_MSG) { | |
struct mg_http_message *hm = (struct mg_http_message *) ev_data; | |
if (mg_match(hm->uri, mg_str("/debug"), NULL)) { | |
int level = (int) mg_json_get_long(hm->body, "$.level", MG_LL_DEBUG); | |
mg_log_set(level); | |
mg_http_reply(c, 200, "", "Debug level set to %d\n", level); | |
} else { | |
size_t size = (size_t) mg_json_get_long(hm->query, "$", 256); | |
if (size == 0) size = 256; | |
*(size_t *) c->data = size; | |
c->is_resp = 1; | |
mg_printf(c, "HTTP/1.1 200 OK\nContent-Length: %lu\n\n", size); | |
mg_hfn_push_data(c); | |
} | |
} else if (ev == MG_EV_POLL) { | |
mg_hfn_push_data(c); | |
} | |
} | |
void run_mongoose(void) { | |
struct mg_mgr mgr; // Mongoose event manager. Holds all connections | |
mg_mgr_init(&mgr); // Initialise event manager | |
mg_http_listen(&mgr, "http://0.0.0.0:80", ev_handler, NULL); | |
for (;;) { | |
mg_mgr_poll(&mgr, 1000); // Infinite event loop | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment