Skip to content

Instantly share code, notes, and snippets.

@cpq
Last active July 22, 2025 06:43
Show Gist options
  • Save cpq/11e74cbbfe050ccd7984e8c07eed7dd0 to your computer and use it in GitHub Desktop.
Save cpq/11e74cbbfe050ccd7984e8c07eed7dd0 to your computer and use it in GitHub Desktop.
Mongoose benchmark on STM32
// 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));
}
}
}
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