Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • kernel/generic/src/console/cmd.c

    r1871118 r0f4f1b2  
    229229};
    230230
     231/* Data and methods for 'printbench' command. */
     232static int cmd_printbench(cmd_arg_t *argv);
     233
     234static cmd_info_t printbench_info = {
     235        .name = "printbench",
     236        .description = "Run a printing benchmark.",
     237        .func = cmd_printbench,
     238        .argc = 0,
     239};
     240
    231241#endif /* CONFIG_TEST */
    232242
     
    613623        &test_info,
    614624        &bench_info,
     625        &printbench_info,
    615626#endif
    616627#ifdef CONFIG_UDEBUG
     
    9931004                        printf("cpu%u: ", i);
    9941005                        thread_wire(thread, &cpus[i]);
    995                         thread_ready(thread_ref(thread));
     1006                        thread_start(thread);
    9961007                        thread_join(thread);
    997                         thread_put(thread);
    9981008                } else
    9991009                        printf("Unable to create thread for cpu%u\n", i);
     
    15821592}
    15831593
     1594int cmd_printbench(cmd_arg_t *argv)
     1595{
     1596        int cnt = 20;
     1597
     1598        uint64_t *data = malloc(sizeof(uint64_t) * cnt);
     1599        if (data == NULL) {
     1600                printf("Error allocating memory for statistics\n");
     1601                return false;
     1602        }
     1603
     1604        for (int i = 0; i < cnt; i++) {
     1605                /*
     1606                 * Update and read thread accounting
     1607                 * for benchmarking
     1608                 */
     1609                irq_spinlock_lock(&TASK->lock, true);
     1610                uint64_t ucycles0, kcycles0;
     1611                task_get_accounting(TASK, &ucycles0, &kcycles0);
     1612                irq_spinlock_unlock(&TASK->lock, true);
     1613
     1614                /* Execute the test */
     1615                for (int j = 0; j < 20; j++) {
     1616                        printf("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789ěščřžýáíéú!@#$%%^&*(){}+\n");
     1617                        printf("ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789ěščřžýáíéú!@#$%%^&*(){}+abcdefghijklmnopqrstuvwxyz\n");
     1618                        printf("0123456789ěščřžýáíéú!@#$%%^&*(){}+abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ\n");
     1619                }
     1620
     1621                /* Update and read thread accounting */
     1622                irq_spinlock_lock(&TASK->lock, true);
     1623                uint64_t ucycles1, kcycles1;
     1624                task_get_accounting(TASK, &ucycles1, &kcycles1);
     1625                irq_spinlock_unlock(&TASK->lock, true);
     1626
     1627                data[i] = ucycles1 - ucycles0 + kcycles1 - kcycles0;
     1628        }
     1629
     1630        printf("\n");
     1631
     1632        uint64_t cycles;
     1633        char suffix;
     1634        uint64_t sum = 0;
     1635
     1636        for (int i = 0; i < cnt; i++) {
     1637                sum += data[i];
     1638        }
     1639
     1640        order_suffix(sum / (uint64_t) cnt, &cycles, &suffix);
     1641        printf("Average\t\t%" PRIu64 "%c\n", cycles, suffix);
     1642
     1643        free(data);
     1644
     1645        return true;
     1646}
     1647
    15841648#endif
    15851649
Note: See TracChangeset for help on using the changeset viewer.